re PR c++/16889 (ambiguity is not detected)
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 24 Aug 2004 16:06:22 +0000 (16:06 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 24 Aug 2004 16:06:22 +0000 (16:06 +0000)
cp:
PR c++/16889
* (is_subobject_of_p): Resurrect & optimize.
(lookup_field_r): Use it.
testsuite:
PR c++/16889
* g++.dg/lookup/ambig[12].C: New.

From-SVN: r86488

gcc/cp/ChangeLog
gcc/cp/search.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/ambig1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lookup/ambig2.C [new file with mode: 0644]

index 9ac0c74dfc4f9649d72648aab01416b9ec080bc4..cc0a9618942b805a5d16c38b4502a42540261cdc 100644 (file)
@@ -1,3 +1,9 @@
+2004-08-24  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/16889
+       * (is_subobject_of_p): Resurrect & optimize.
+       (lookup_field_r): Use it.
+
 2004-08-24  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/16706
index 81226d13d33ae34b37fc7393f139d14966433c3a..4aadf78adf8f0aff816e19822c9bf4a72142d0c1 100644 (file)
@@ -45,6 +45,7 @@ struct vbase_info
   tree inits;
 };
 
+static int is_subobject_of_p (tree, tree);
 static tree dfs_check_overlap (tree, void *);
 static tree dfs_no_overlap_yet (tree, int, void *);
 static base_kind lookup_base_r (tree, tree, base_access, bool, tree *);
@@ -1018,7 +1019,6 @@ template_self_reference_p (tree type, tree decl)
           && DECL_NAME (decl) == constructor_name (type));
 }
 
-
 /* Nonzero for a class member means that it is shared between all objects
    of that class.
 
@@ -1048,6 +1048,26 @@ shared_member_p (tree t)
   return 0;
 }
 
+/* Routine to see if the sub-object denoted by the binfo PARENT can be
+   found as a base class and sub-object of the object denoted by
+   BINFO.  */
+
+static int
+is_subobject_of_p (tree parent, tree binfo)
+{
+  tree probe;
+  
+  for (probe = parent; probe; probe = BINFO_INHERITANCE_CHAIN (probe))
+    {
+      if (probe == binfo)
+       return 1;
+      if (BINFO_VIRTUAL_P (probe))
+       return (binfo_for_vbase (BINFO_TYPE (probe), BINFO_TYPE (binfo))
+               != NULL_TREE);
+    }
+  return 0;
+}
+
 /* DATA is really a struct lookup_field_info.  Look for a field with
    the name indicated there in BINFO.  If this function returns a
    non-NULL value it is the result of the lookup.  Called from
@@ -1115,12 +1135,14 @@ lookup_field_r (tree binfo, void *data)
 
   /* If the lookup already found a match, and the new value doesn't
      hide the old one, we might have an ambiguity.  */
-  if (lfi->rval_binfo && !original_binfo (lfi->rval_binfo, binfo))
+  if (lfi->rval_binfo
+      && !is_subobject_of_p (lfi->rval_binfo, binfo))
+    
     {
       if (nval == lfi->rval && shared_member_p (nval))
        /* The two things are really the same.  */
        ;
-      else if (original_binfo (binfo, lfi->rval_binfo))
+      else if (is_subobject_of_p (binfo, lfi->rval_binfo))
        /* The previous value hides the new one.  */
        ;
       else
index 7264db71fe6bfe0412e8fdb5bfaf1ca004828cd7..313d5a2166e31ac890364e886503d94a5586d970 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-24  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/16889
+       * g++.dg/lookup/ambig[12].C: New.
+
 2004-08-24  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/16706
diff --git a/gcc/testsuite/g++.dg/lookup/ambig1.C b/gcc/testsuite/g++.dg/lookup/ambig1.C
new file mode 100644 (file)
index 0000000..1cf9ab4
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Aug 2004 <nathan@codesourcery.com>
+// Origin: Wolfgang Bangerth  <bangerth@dealii.org>
+
+// Bug 16889:Undetected ambiguity.
+
+struct B { 
+  int f(); // { dg-error "int B::f" "" }
+}; 
+struct B1 : virtual B {}; 
+struct B2 : B {}; 
+struct BB : B1, B2 {}; 
+int i = BB().f();  // { dg-error "ambiguous" "" }
diff --git a/gcc/testsuite/g++.dg/lookup/ambig2.C b/gcc/testsuite/g++.dg/lookup/ambig2.C
new file mode 100644 (file)
index 0000000..4d423d1
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 24 Aug 2004 <nathan@codesourcery.com>
+// Origin: Wolfgang Bangerth  <bangerth@dealii.org>
+
+// Bug 16889:Undetected ambiguity.
+
+struct B { 
+  int i; // { dg-error "int B::i" "" }
+}; 
+struct B1 : virtual B {}; 
+struct B2 : B {}; 
+struct BB : B1, B2 {}; 
+int i = BB().i;  // { dg-error "ambiguous" "" }