almost there w/ the rewrite testin' ... [Re: template enum buglet?]
Mark Mitchell
mark@markmitchell.com
Thu Aug 27 00:15:00 GMT 1998
Brendan --
OK, here's the fix. Some code I wrote in pt.c sensibly assumed a
correct DECL_CONTEXT for the CONST_DECLs, but it was not being set
up. (Another side-effect of this fix, by the way, is that the names
of enumeration constants in class/function scope are now printed
correctly in error messages; previously they were given as unqualified
names.)
--
Mark Mitchell mark@markmitchell.com
Mark Mitchell Consulting http://www.markmitchell.com
1998-08-27 Mark Mitchell <mark@markmitchell.com>
* decl.c (build_enumerator): Set DECL_CONTEXT for the
CONST_DECLs.
Index: testsuite/g++.old-deja/g++.pt/enum9.C
===================================================================
RCS file: enum9.C
diff -N enum9.C
*** /dev/null Mon Dec 31 20:00:00 1979
--- enum9.C Thu Aug 27 00:08:40 1998
***************
*** 0 ****
--- 1,13 ----
+ // Build don't link:
+
+ template <typename _CharT>
+ class _Format_cache
+ {
+ public:
+ enum {
+ _S_digits, _S_digits_end = _S_digits+10,
+ _S_xdigits = _S_digits_end,
+ };
+ };
+
+ template class _Format_cache<int>;
Index: cp/decl.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/decl.c,v
retrieving revision 1.193
diff -c -p -r1.193 decl.c
*** decl.c 1998/08/26 13:55:42 1.193
--- decl.c 1998/08/27 07:09:46
*************** build_enumerator (name, value)
*** 11994,11999 ****
--- 11994,12000 ----
tree name, value;
{
tree decl, result;
+ tree context;
/* Remove no-op casts from the value. */
if (value)
*************** build_enumerator (name, value)
*** 12042,12071 ****
value = copy_node (value);
/* C++ associates enums with global, function, or class declarations. */
! decl = current_scope ();
! if (decl && decl == current_class_type)
! {
! /* This enum declaration is local to the class, so we must put
! it in that class's list of decls. */
! decl = build_lang_field_decl (CONST_DECL, name, integer_type_node);
! DECL_INITIAL (decl) = value;
! TREE_READONLY (decl) = 1;
! pushdecl_class_level (decl);
! TREE_CHAIN (decl) = current_local_enum;
! current_local_enum = decl;
! }
! else
! {
! /* It's a global enum, or it's local to a function. (Note local to
! a function could mean local to a class method. */
! decl = build_decl (CONST_DECL, name, integer_type_node);
! DECL_INITIAL (decl) = value;
! TREE_READONLY (decl) = 1;
!
! pushdecl (decl);
! GNU_xref_decl (current_function_decl, decl);
! }
if (! processing_template_decl)
{
--- 12043,12073 ----
value = copy_node (value);
/* C++ associates enums with global, function, or class declarations. */
+
+ context = current_scope ();
+ if (context && context == current_class_type)
+ /* This enum declaration is local to the class. */
+ decl = build_lang_field_decl (CONST_DECL, name, integer_type_node);
+ else
+ /* It's a global enum, or it's local to a function. (Note local to
+ a function could mean local to a class method. */
+ decl = build_decl (CONST_DECL, name, integer_type_node);
+
+ DECL_CONTEXT (decl) = FROB_CONTEXT (context);
+ DECL_INITIAL (decl) = value;
+ TREE_READONLY (decl) = 1;
! if (context && context == current_class_type)
! {
! pushdecl_class_level (decl);
! TREE_CHAIN (decl) = current_local_enum;
! current_local_enum = decl;
! }
! else
! {
! pushdecl (decl);
! GNU_xref_decl (current_function_decl, decl);
! }
if (! processing_template_decl)
{
More information about the Gcc-patches
mailing list