C++ (parser) regression?

Mark Mitchell mark@codesourcery.com
Tue Aug 13 09:38:00 GMT 2002



--On Tuesday, August 13, 2002 03:09:40 PM +0200 Gerald Pfeifer 
<pfeifer@dbai.tuwien.ac.at> wrote:

> On 13 Aug 2002, Gabriel Dos Reis wrote:
>> |   % cat x.cc
>> |   #include <set>
>> |
>> |   using namespace std;
>> |
>> |   class C : public set<int> {
>> |       void add(const int i) {
>> |           insert(i);
>> |           }
>> |       };

Fixed with the attached patch.

This was a latent bug; we were silently treating overloaded functions
as equivalent to the first function in the overload set for name-lookup
purposes.  As long as we looked up every name multiple times, we only
had to get it right the last time; now that we're not so wasteful we
have to get it right all the time.

Tested on i686-pc-linux-gnu, applied on the mainline.

-- 
Mark Mitchell                mark@codesourcery.com
CodeSourcery, LLC            http://www.codesourcery.com

2002-08-13  Mark Mitchell  <mark@codesourcery.com>

	* decl.c (pushdecl_class_level): Honor requests to bind names to
	OVERLOADs.

2002-08-13  Mark Mitchell  <mark@codesourcery.com>

	* g++.dg/template/inherit3: New test.

Index: cp/decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,v
retrieving revision 1.930
diff -c -p -r1.930 decl.c
*** cp/decl.c	11 Aug 2002 16:05:27 -0000	1.930
--- cp/decl.c	13 Aug 2002 16:32:47 -0000
*************** void
*** 4259,4271 ****
  pushdecl_class_level (x)
       tree x;
  {
!   /* Don't use DECL_ASSEMBLER_NAME here!  Everything that looks in class
!      scope looks for the pre-mangled name.  */
!   register tree name;

    if (TREE_CODE (x) == OVERLOAD)
!     x = OVL_CURRENT (x);
!   name = DECL_NAME (x);

    if (name)
      {
--- 4259,4271 ----
  pushdecl_class_level (x)
       tree x;
  {
!   tree name;

+   /* Get the name of X.  */
    if (TREE_CODE (x) == OVERLOAD)
!     name = DECL_NAME (get_first_fn (x));
!   else
!     name = DECL_NAME (x);

    if (name)
      {
*************** pushdecl_class_level (x)
*** 4275,4285 ****
      }
    else if (ANON_AGGR_TYPE_P (TREE_TYPE (x)))
      {
        tree f;

!       for (f = TYPE_FIELDS (TREE_TYPE (x));
! 	   f;
! 	   f = TREE_CHAIN (f))
  	pushdecl_class_level (f);
      }
  }
--- 4275,4286 ----
      }
    else if (ANON_AGGR_TYPE_P (TREE_TYPE (x)))
      {
+       /* If X is an anonymous aggregate, all of its members are
+ 	 treated as if they were members of the class containing the
+ 	 aggregate, for naming purposes.  */
        tree f;

!       for (f = TYPE_FIELDS (TREE_TYPE (x)); f; f = TREE_CHAIN (f))
  	pushdecl_class_level (f);
      }
  }
Index: testsuite/g++.dg/template/inherit3.C
===================================================================
RCS file: testsuite/g++.dg/template/inherit3.C
diff -N testsuite/g++.dg/template/inherit3.C
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/g++.dg/template/inherit3.C	13 Aug 2002 16:34:29 -0000
***************
*** 0 ****
--- 1,12 ----
+ template <typename T>
+ struct set {
+   void insert (const T&);
+   template <class X>
+   void insert  (X, X);
+ };
+
+ struct C : public set<int> {
+   void f (const int i) {
+     insert (i);
+   }
+ };



More information about the Libstdc++ mailing list