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
This commit is contained in:
Mark Mitchell 2000-07-23 19:59:41 +00:00 committed by Mark Mitchell
parent 07964b9c09
commit 95ee998ceb
7 changed files with 106 additions and 48 deletions

View File

@ -1,3 +1,8 @@
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>
* config/i860/i860.md (untyped_call expander): Use GEN_CALL

View File

@ -96,7 +96,7 @@ make_rtl_for_local_static (decl)
/* If we inlined this variable, we could see it's declaration
again. */
if (DECL_RTL (decl))
if (TREE_ASM_WRITTEN (decl))
return;
if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))

View File

@ -1,3 +1,10 @@
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>
* cp-tree.h: Use __FUNCTION__ not __PRETTY_FUNCTION__.

View File

@ -7825,11 +7825,8 @@ make_rtl_for_nonlocal_decl (decl, init, asmspec)
tree init;
const char *asmspec;
{
int toplev;
tree type;
type = TREE_TYPE (decl);
toplev = toplevel_bindings_p ();
int toplev = toplevel_bindings_p ();
int defer_p;
/* Handle non-variables up front. */
if (TREE_CODE (decl) != VAR_DECL)
@ -7838,54 +7835,55 @@ make_rtl_for_nonlocal_decl (decl, init, asmspec)
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. */
if (asmspec)
DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
if (DECL_VIRTUAL_P (decl))
make_decl_rtl (decl, NULL_PTR, toplev);
else if (TREE_READONLY (decl)
&& 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));
/* We don't create any RTL for local variables. */
if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl))
return;
if (toplev && ! TREE_PUBLIC (decl))
{
/* If this is a static const, change its apparent linkage
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);
/* We defer emission of local statics until the corresponding
DECL_STMT is expanded. */
defer_p = DECL_FUNCTION_SCOPE_P (decl) || DECL_VIRTUAL_P (decl);
if (init == NULL_TREE
#ifdef DEFAULT_STATIC_DEFS
/* If this code is dead, then users must
explicitly declare static member variables
outside the class def'n as well. */
&& TYPE_NEEDS_CONSTRUCTING (type)
#endif
)
/* We try to defer namespace-scope static constants so that they are
not emitted into the object file unncessarily. */
if (!DECL_VIRTUAL_P (decl)
&& TREE_READONLY (decl)
&& DECL_INITIAL (decl) != NULL_TREE
&& DECL_INITIAL (decl) != error_mark_node
&& ! 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;
make_decl_rtl (decl, asmspec, 1);
TREE_PUBLIC (decl) = 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);
}

View File

@ -3785,9 +3785,6 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope)
return error_mark_node;
}
if (context == NULL_TREE)
context = global_namespace;
if (TREE_CODE (template) != TEMPLATE_DECL)
{
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)
return found;
}
context = tsubst (DECL_CONTEXT (template), arglist,
/*complain=*/0, in_decl);
if (!context)
context = global_namespace;
/* Create the type. */
if (TREE_CODE (template_type) == ENUMERAL_TYPE)
{

View File

@ -0,0 +1,38 @@
// 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;
}

View File

@ -0,0 +1,8 @@
// Build don't link:
// Origin: Jason Merrill <jason@redhat.com>
int main ()
{
static const int n = 10;
static const int *p = &n;
}