Commit 3febd123 by Nathan Sidwell Committed by Nathan Sidwell

cp-tree.h (lang_decl_flags): Rename defined_in_class to initialized_in_class.

cp:
	* cp-tree.h (lang_decl_flags): Rename defined_in_class to
	initialized_in_class.
	(DECL_DEFINED_IN_CLASS_P): Rename to ...
	(DECL_INITIALIZED_IN_CLASS_P): ... here, to reflect true meaning.
	* decl.c (duplicate_decls): Preseve DECL_INITIALIZED_IN_CLASS_P.
	(cp_finish_decl): Adjust for DECL_INITIALIZED_IN_CLASS_P.
	* pt.c (check_default_tmpl_args): Adjust for
	DECL_INITIALIZED_IN_CLASS_P.
	(instantiate_class_template): Likewise.
	(instantiate_decl): Check DECL_INITIALIZED_IN_CLASS_P.

	* class.c (finish_struct): Constify saved_filename.
testsuite:
	* g++.old_deja/g++.pt/instantiate12.C: New test.

From-SVN: r38801
parent c7861455
2001-01-08 Nathan Sidwell <nathan@codesourcery.com> 2001-01-08 Nathan Sidwell <nathan@codesourcery.com>
* cp-tree.h (lang_decl_flags): Rename defined_in_class to
initialized_in_class.
(DECL_DEFINED_IN_CLASS_P): Rename to ...
(DECL_INITIALIZED_IN_CLASS_P): ... here, to reflect true meaning.
* decl.c (duplicate_decls): Preseve DECL_INITIALIZED_IN_CLASS_P.
(cp_finish_decl): Adjust for DECL_INITIALIZED_IN_CLASS_P.
* pt.c (check_default_tmpl_args): Adjust for
DECL_INITIALIZED_IN_CLASS_P.
(instantiate_class_template): Likewise.
(instantiate_decl): Check DECL_INITIALIZED_IN_CLASS_P.
* class.c (finish_struct): Constify saved_filename.
2001-01-08 Nathan Sidwell <nathan@codesourcery.com>
* class.c (duplicate_tag_error): Adjust diagnostic. * class.c (duplicate_tag_error): Adjust diagnostic.
(finish_struct): Locally set location to start of struct. (finish_struct): Locally set location to start of struct.
* decl.c (fixup_anonymous_aggr): Use cp_error_at. * decl.c (fixup_anonymous_aggr): Use cp_error_at.
......
...@@ -5328,7 +5328,7 @@ tree ...@@ -5328,7 +5328,7 @@ tree
finish_struct (t, attributes) finish_struct (t, attributes)
tree t, attributes; tree t, attributes;
{ {
char *saved_filename = input_filename; const char *saved_filename = input_filename;
int saved_lineno = lineno; int saved_lineno = lineno;
/* Now that we've got all the field declarations, reverse everything /* Now that we've got all the field declarations, reverse everything
......
...@@ -1812,7 +1812,7 @@ struct lang_decl_flags ...@@ -1812,7 +1812,7 @@ struct lang_decl_flags
unsigned declared_inline : 1; unsigned declared_inline : 1;
unsigned not_really_extern : 1; unsigned not_really_extern : 1;
unsigned needs_final_overrider : 1; unsigned needs_final_overrider : 1;
unsigned defined_in_class : 1; unsigned initialized_in_class : 1;
unsigned pending_inline_p : 1; unsigned pending_inline_p : 1;
unsigned global_ctor_p : 1; unsigned global_ctor_p : 1;
...@@ -2042,10 +2042,10 @@ struct lang_decl ...@@ -2042,10 +2042,10 @@ struct lang_decl
should be allocated. */ should be allocated. */
#define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3(NODE)) #define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3(NODE))
/* Nonzero if the DECL was defined in the class definition itself, /* Nonzero if the DECL was initialized in the class definition itself,
rather than outside the class. */ rather than outside the class. */
#define DECL_DEFINED_IN_CLASS_P(DECL) \ #define DECL_INITIALIZED_IN_CLASS_P(DECL) \
(DECL_LANG_SPECIFIC (DECL)->decl_flags.defined_in_class) (DECL_LANG_SPECIFIC (DECL)->decl_flags.initialized_in_class)
/* Nonzero for FUNCTION_DECL means that this decl is just a /* Nonzero for FUNCTION_DECL means that this decl is just a
friend declaration, and should not be added to the list of friend declaration, and should not be added to the list of
......
...@@ -3573,6 +3573,8 @@ duplicate_decls (newdecl, olddecl) ...@@ -3573,6 +3573,8 @@ duplicate_decls (newdecl, olddecl)
DECL_ACCESS (newdecl) = DECL_ACCESS (olddecl); DECL_ACCESS (newdecl) = DECL_ACCESS (olddecl);
DECL_NONCONVERTING_P (newdecl) = DECL_NONCONVERTING_P (olddecl); DECL_NONCONVERTING_P (newdecl) = DECL_NONCONVERTING_P (olddecl);
DECL_TEMPLATE_INFO (newdecl) = DECL_TEMPLATE_INFO (olddecl); DECL_TEMPLATE_INFO (newdecl) = DECL_TEMPLATE_INFO (olddecl);
DECL_INITIALIZED_IN_CLASS_P (newdecl)
|= DECL_INITIALIZED_IN_CLASS_P (olddecl);
olddecl_friend = DECL_FRIEND_P (olddecl); olddecl_friend = DECL_FRIEND_P (olddecl);
/* Only functions have DECL_BEFRIENDING_CLASSES. */ /* Only functions have DECL_BEFRIENDING_CLASSES. */
...@@ -7931,7 +7933,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags) ...@@ -7931,7 +7933,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
&& CP_DECL_CONTEXT (decl) == current_class_type && CP_DECL_CONTEXT (decl) == current_class_type
&& TYPE_BEING_DEFINED (current_class_type) && TYPE_BEING_DEFINED (current_class_type)
&& (DECL_INITIAL (decl) || init)) && (DECL_INITIAL (decl) || init))
DECL_DEFINED_IN_CLASS_P (decl) = 1; DECL_INITIALIZED_IN_CLASS_P (decl) = 1;
if (TREE_CODE (decl) == VAR_DECL if (TREE_CODE (decl) == VAR_DECL
&& DECL_CONTEXT (decl) && DECL_CONTEXT (decl)
......
/* Handle parameterized types (templates) for GNU C++. /* Handle parameterized types (templates) for GNU C++.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
Free Software Foundation, Inc. 2001 Free Software Foundation, Inc.
Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing. Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.
Rewritten by Jason Merrill (jason@cygnus.com). Rewritten by Jason Merrill (jason@cygnus.com).
...@@ -2300,7 +2300,7 @@ check_default_tmpl_args (decl, parms, is_primary, is_partial) ...@@ -2300,7 +2300,7 @@ check_default_tmpl_args (decl, parms, is_primary, is_partial)
current_class_type))) current_class_type)))
/* And, if it was a member function, it really was defined in /* And, if it was a member function, it really was defined in
the scope of the class. */ the scope of the class. */
&& (!DECL_FUNCTION_MEMBER_P (decl) || DECL_DEFINED_IN_CLASS_P (decl))) && (!DECL_FUNCTION_MEMBER_P (decl) || DECL_INITIALIZED_IN_CLASS_P (decl)))
/* We already checked these parameters when the template was /* We already checked these parameters when the template was
declared, so there's no need to do it again now. This function declared, so there's no need to do it again now. This function
was defined in class scope, but we're processing it's body now was defined in class scope, but we're processing it's body now
...@@ -5059,7 +5059,7 @@ instantiate_class_template (type) ...@@ -5059,7 +5059,7 @@ instantiate_class_template (type)
{ {
tree init; tree init;
if (DECL_DEFINED_IN_CLASS_P (r)) if (DECL_INITIALIZED_IN_CLASS_P (r))
init = tsubst_expr (DECL_INITIAL (t), args, init = tsubst_expr (DECL_INITIAL (t), args,
/*complain=*/1, NULL_TREE); /*complain=*/1, NULL_TREE);
else else
...@@ -5069,7 +5069,7 @@ instantiate_class_template (type) ...@@ -5069,7 +5069,7 @@ instantiate_class_template (type)
/*asmspec_tree=*/NULL_TREE, /*asmspec_tree=*/NULL_TREE,
/*flags=*/0); /*flags=*/0);
if (DECL_DEFINED_IN_CLASS_P (r)) if (DECL_INITIALIZED_IN_CLASS_P (r))
check_static_variable_definition (r, TREE_TYPE (r)); check_static_variable_definition (r, TREE_TYPE (r));
} }
...@@ -9728,12 +9728,9 @@ instantiate_decl (d, defer_ok) ...@@ -9728,12 +9728,9 @@ instantiate_decl (d, defer_ok)
import_export_decl (d); import_export_decl (d);
} }
/* We need to set up DECL_INITIAL regardless of pattern_defined if /* We need to set up DECL_INITIAL regardless, if
the variable is a static const initialized in the class body. */ the variable is initialized in the class body. */
if (TREE_CODE (d) == VAR_DECL if (TREE_CODE (d) == VAR_DECL && DECL_INITIALIZED_IN_CLASS_P (d))
&& TREE_READONLY (d)
&& DECL_INITIAL (d) == NULL_TREE
&& DECL_INITIAL (code_pattern) != NULL_TREE)
; ;
/* Reject all external templates except inline functions. */ /* Reject all external templates except inline functions. */
else if (DECL_INTERFACE_KNOWN (d) else if (DECL_INTERFACE_KNOWN (d)
......
2001-01-08 Nathan Sidwell <nathan@codesourcery.com> 2001-01-08 Nathan Sidwell <nathan@codesourcery.com>
* g++.old_deja/g++.pt/instantiate12.C: New test.
2001-01-08 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.benjamin/15309-1.C: Expect diagnostic at * g++.old-deja/g++.benjamin/15309-1.C: Expect diagnostic at
start of structs. start of structs.
* g++.old-deja/g++.benjamin/15309-2.C: Likewise. * g++.old-deja/g++.benjamin/15309-2.C: Likewise.
......
// Copyright (C) 2000 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 14 Nov 2000 <nathan@codesourcery.com>
// Bug 635. We failed to emit initializer code for out-of-class defined
// static const members of template instantiations.
static int inited = 0;
static bool setFlag()
{
inited++;
return true;
}
template<typename T> struct X
{
static const bool cflag;
static bool flag;
static const bool iflag = true;
static const bool jflag = true;
};
template<typename T> const bool X<T>::cflag (setFlag ());
template<typename T> bool X<T>::flag (setFlag ());
template<typename T> const bool X<T>::iflag;
int main ()
{
X<int> a;
if (!a.flag)
return 1;
if (!a.cflag)
return 2;
if (!a.iflag)
return 3;
if (!a.jflag)
return 5;
if (!X<float>::flag)
return 5;
if (!X<float>::cflag)
return 6;
if (!X<float>::iflag)
return 7;
if (!X<float>::jflag)
return 8;
if (inited != 4)
return 9;
return 0;
}
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