re PR c++/33094 (ICE on valid C++ virtual template static member in anonymous namespace)
PR c++/33094 * decl.c (make_rtl_for_nonlocal_decl): It's ok for a member constant to not have DECL_EXTERNAL if it's file-local. From-SVN: r128890
This commit is contained in:
parent
38b1c01c84
commit
dc472c59a5
|
@ -1,3 +1,9 @@
|
|||
2007-09-29 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/33094
|
||||
* decl.c (make_rtl_for_nonlocal_decl): It's ok for a member
|
||||
constant to not have DECL_EXTERNAL if it's file-local.
|
||||
|
||||
2007-09-28 Ollie Wild <aaw@google.com>
|
||||
|
||||
Revert
|
||||
|
|
|
@ -3225,7 +3225,11 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
|
|||
|
||||
/* DECL_EXTERNAL must be set on a decl until the decl is actually emitted,
|
||||
so that assemble_external will work properly. So we have this flag to
|
||||
tell us whether the decl is really not external. */
|
||||
tell us whether the decl is really not external.
|
||||
|
||||
This flag does not indicate whether or not the decl is defined in the
|
||||
current translation unit; it indicates whether or not we should emit the
|
||||
decl at the end of compilation if it is defined and needed. */
|
||||
#define DECL_NOT_REALLY_EXTERN(NODE) \
|
||||
(DECL_LANG_SPECIFIC (NODE)->decl_flags.not_really_extern)
|
||||
|
||||
|
|
|
@ -5092,7 +5092,7 @@ make_rtl_for_nonlocal_decl (tree decl, tree init, const char* asmspec)
|
|||
/* An in-class declaration of a static data member should be
|
||||
external; it is only a declaration, and not a definition. */
|
||||
if (init == NULL_TREE)
|
||||
gcc_assert (DECL_EXTERNAL (decl));
|
||||
gcc_assert (DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl));
|
||||
}
|
||||
|
||||
/* We don't create any RTL for local variables. */
|
||||
|
|
|
@ -1314,6 +1314,9 @@ coerce_delete_type (tree type)
|
|||
return type;
|
||||
}
|
||||
|
||||
/* DECL is a VAR_DECL for a vtable: walk through the entries in the vtable
|
||||
and mark them as needed. */
|
||||
|
||||
static void
|
||||
mark_vtable_entries (tree decl)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
// PR c++/33094
|
||||
// { dg-final { scan-assembler "1BIiE1cE" } }
|
||||
// { dg-final { scan-assembler-not "globl.*1BIiE1cE" } }
|
||||
// { dg-final { scan-assembler-not "1CIiE1cE" } }
|
||||
|
||||
// Test that B<int>::c is emitted as an internal symbol, and C<int>::c is
|
||||
// not emitted.
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T>
|
||||
class A
|
||||
{
|
||||
virtual T f1() { return c; }
|
||||
static const T c = 0;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class B
|
||||
{
|
||||
static const T c = 0;
|
||||
};
|
||||
|
||||
template <typename T> const T B<T>::c;
|
||||
|
||||
template class A<int>;
|
||||
template class B<int>;
|
||||
}
|
Loading…
Reference in New Issue