Commit 95ee998c by Mark Mitchell Committed by Mark Mitchell

c-semantics.c (make_rtl_for_local_static): Use TREE_ASM_WRITTEN to figure out…

c-semantics.c (make_rtl_for_local_static): Use TREE_ASM_WRITTEN to figure out whether or not a variable has already been...

	* c-semantics.c (make_rtl_for_local_static): Use TREE_ASM_WRITTEN
	to figure out whether or not a variable has already been emitted.

	* decl.c (make_rtl_for_nonlocal_decl): Rework.

	* pt.c (lookup_template_class): Ensure that TYPE_CONTEXT is set
	correctly.

From-SVN: r35215
parent 07964b9c
2000-07-23 Mark Mitchell <mark@codesourcery.com>
* c-semantics.c (make_rtl_for_local_static): Use TREE_ASM_WRITTEN
to figure out whether or not a variable has already been emitted.
Sun Jul 23 14:49:12 2000 Jason Eckhardt <jle@cygnus.com> Sun Jul 23 14:49:12 2000 Jason Eckhardt <jle@cygnus.com>
* config/i860/i860.md (untyped_call expander): Use GEN_CALL * config/i860/i860.md (untyped_call expander): Use GEN_CALL
......
...@@ -96,7 +96,7 @@ make_rtl_for_local_static (decl) ...@@ -96,7 +96,7 @@ make_rtl_for_local_static (decl)
/* If we inlined this variable, we could see it's declaration /* If we inlined this variable, we could see it's declaration
again. */ again. */
if (DECL_RTL (decl)) if (TREE_ASM_WRITTEN (decl))
return; return;
if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl)) if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
......
2000-07-23 Mark Mitchell <mark@codesourcery.com>
* decl.c (make_rtl_for_nonlocal_decl): Rework.
* pt.c (lookup_template_class): Ensure that TYPE_CONTEXT is set
correctly.
2000-07-20 Zack Weinberg <zack@wolery.cumb.org> 2000-07-20 Zack Weinberg <zack@wolery.cumb.org>
* cp-tree.h: Use __FUNCTION__ not __PRETTY_FUNCTION__. * cp-tree.h: Use __FUNCTION__ not __PRETTY_FUNCTION__.
......
...@@ -7825,11 +7825,8 @@ make_rtl_for_nonlocal_decl (decl, init, asmspec) ...@@ -7825,11 +7825,8 @@ make_rtl_for_nonlocal_decl (decl, init, asmspec)
tree init; tree init;
const char *asmspec; const char *asmspec;
{ {
int toplev; int toplev = toplevel_bindings_p ();
tree type; int defer_p;
type = TREE_TYPE (decl);
toplev = toplevel_bindings_p ();
/* Handle non-variables up front. */ /* Handle non-variables up front. */
if (TREE_CODE (decl) != VAR_DECL) if (TREE_CODE (decl) != VAR_DECL)
...@@ -7838,54 +7835,55 @@ make_rtl_for_nonlocal_decl (decl, init, asmspec) ...@@ -7838,54 +7835,55 @@ make_rtl_for_nonlocal_decl (decl, init, asmspec)
return; return;
} }
/* If we see a class member here, it should be a static data
member. */
if (DECL_LANG_SPECIFIC (decl) && DECL_IN_AGGR_P (decl))
{
my_friendly_assert (TREE_STATIC (decl), 19990828);
/* 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)
my_friendly_assert (DECL_EXTERNAL (decl), 20000723);
}
/* Set the DECL_ASSEMBLER_NAME for the variable. */ /* Set the DECL_ASSEMBLER_NAME for the variable. */
if (asmspec) if (asmspec)
DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec); DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
if (DECL_VIRTUAL_P (decl)) /* We don't create any RTL for local variables. */
make_decl_rtl (decl, NULL_PTR, toplev); if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl))
else if (TREE_READONLY (decl) return;
&& DECL_INITIAL (decl) != NULL_TREE
&& DECL_INITIAL (decl) != error_mark_node
&& ! EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
{
DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
if (toplev && ! TREE_PUBLIC (decl)) /* We defer emission of local statics until the corresponding
{ DECL_STMT is expanded. */
/* If this is a static const, change its apparent linkage defer_p = DECL_FUNCTION_SCOPE_P (decl) || DECL_VIRTUAL_P (decl);
if it belongs to a #pragma interface. */
if (!interface_unknown)
{
TREE_PUBLIC (decl) = 1;
DECL_EXTERNAL (decl) = interface_only;
}
make_decl_rtl (decl, asmspec, toplev);
}
else if (toplev)
rest_of_decl_compilation (decl, asmspec, toplev, at_eof);
}
else if (DECL_LANG_SPECIFIC (decl) && DECL_IN_AGGR_P (decl))
{
my_friendly_assert (TREE_STATIC (decl), 19990828);
if (init == NULL_TREE /* We try to defer namespace-scope static constants so that they are
#ifdef DEFAULT_STATIC_DEFS not emitted into the object file unncessarily. */
/* If this code is dead, then users must if (!DECL_VIRTUAL_P (decl)
explicitly declare static member variables && TREE_READONLY (decl)
outside the class def'n as well. */ && DECL_INITIAL (decl) != NULL_TREE
&& TYPE_NEEDS_CONSTRUCTING (type) && DECL_INITIAL (decl) != error_mark_node
#endif && ! EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl))
) && toplev
&& !TREE_PUBLIC (decl))
{
/* Fool with the linkage according to #pragma interface. */
if (!interface_unknown)
{ {
DECL_EXTERNAL (decl) = 1; TREE_PUBLIC (decl) = 1;
make_decl_rtl (decl, asmspec, 1); DECL_EXTERNAL (decl) = interface_only;
} }
else
rest_of_decl_compilation (decl, asmspec, toplev, at_eof); defer_p = 1;
} }
else if (TREE_CODE (CP_DECL_CONTEXT (decl)) == NAMESPACE_DECL
|| (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))) /* If we're deferring the variable, just make RTL. Do not actually
emit the variable. */
if (defer_p)
make_decl_rtl (decl, asmspec, toplev);
/* If we're not deferring, go ahead and assemble the variable. */
else
rest_of_decl_compilation (decl, asmspec, toplev, at_eof); rest_of_decl_compilation (decl, asmspec, toplev, at_eof);
} }
......
...@@ -3785,9 +3785,6 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope) ...@@ -3785,9 +3785,6 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope)
return error_mark_node; return error_mark_node;
} }
if (context == NULL_TREE)
context = global_namespace;
if (TREE_CODE (template) != TEMPLATE_DECL) if (TREE_CODE (template) != TEMPLATE_DECL)
{ {
cp_error ("non-template type `%T' used as a template", d1); cp_error ("non-template type `%T' used as a template", d1);
...@@ -3963,6 +3960,11 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope) ...@@ -3963,6 +3960,11 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope)
return found; return found;
} }
context = tsubst (DECL_CONTEXT (template), arglist,
/*complain=*/0, in_decl);
if (!context)
context = global_namespace;
/* Create the type. */ /* Create the type. */
if (TREE_CODE (template_type) == ENUMERAL_TYPE) if (TREE_CODE (template_type) == ENUMERAL_TYPE)
{ {
......
// Build don't link:
#include <typeinfo>
struct GcspFlags
{
enum Enum
{
OffYes,
OffNo,
Root
};
static char const* name(Enum flag);
template<Enum GCSP_FLAG>
struct btmFlag
{
static Enum const f=OffNo;
};
};
template<>
struct
GcspFlags::btmFlag<GcspFlags::OffYes>
{
static GcspFlags::Enum const f=GcspFlags::OffYes;
};
int
main ()
{
GcspFlags::btmFlag<GcspFlags::OffYes> f;
const type_info& ti = typeid (f);
return 0;
}
// Build don't link:
// Origin: Jason Merrill <jason@redhat.com>
int main ()
{
static const int n = 10;
static const int *p = &n;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment