re PR c++/48051 (sorry, unimplemented: mangling overload)
authorJason Merrill <jason@redhat.com>
Thu, 12 Jan 2012 17:27:07 +0000 (12:27 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 12 Jan 2012 17:27:07 +0000 (12:27 -0500)
PR c++/48051
* mangle.c (write_expression): Mangle BASELINK scope if
BASELINK_QUALIFIED_P.
* search.c (adjust_result_of_qualified_name_lookup): Set
BASELINK_QUALIFIED_P.
* tree.c (cp_tree_equal) [BASELINK]: Compare BASELINK_QUALIFIED_P.
* parser.c (cp_parser_postfix_dot_deref_expression): Don't call
adjust_result_of_qualified_name_lookup for non-qualified names.

From-SVN: r183133

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/cp/parser.c
gcc/cp/search.c
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/mangle48.C
gcc/testsuite/g++.dg/abi/mangle58.C

index 9af1a140d0da4eb2718b41b35d1f3baf5334a3a5..6047df3a2ed0ad625d0b771abab74f8beb30cb07 100644 (file)
@@ -1,5 +1,14 @@
 2012-01-12  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48051
+       * mangle.c (write_expression): Mangle BASELINK scope if
+       BASELINK_QUALIFIED_P.
+       * search.c (adjust_result_of_qualified_name_lookup): Set
+       BASELINK_QUALIFIED_P.
+       * tree.c (cp_tree_equal) [BASELINK]: Compare BASELINK_QUALIFIED_P.
+       * parser.c (cp_parser_postfix_dot_deref_expression): Don't call
+       adjust_result_of_qualified_name_lookup for non-qualified names.
+
        PR c++/51403
        * pt.c (unify): Handle error_mark_node.
 
index 60b187007b17a9d06fc225a34c9209b07b5a4382..5f2fa157a9c5f6510db760c27dc2fb652cf0f7a2 100644 (file)
@@ -2500,7 +2500,9 @@ write_expression (tree expr)
       code = TREE_CODE (expr);
     }
 
-  if (code == BASELINK)
+  if (code == BASELINK
+      && (!type_unknown_p (expr)
+         || !BASELINK_QUALIFIED_P (expr)))
     {
       expr = BASELINK_FUNCTIONS (expr);
       code = TREE_CODE (expr);
@@ -2583,10 +2585,20 @@ write_expression (tree expr)
       write_string ("at");
       write_type (TREE_OPERAND (expr, 0));
     }
-  else if (TREE_CODE (expr) == SCOPE_REF)
+  else if (code == SCOPE_REF
+          || code == BASELINK)
     {
-      tree scope = TREE_OPERAND (expr, 0);
-      tree member = TREE_OPERAND (expr, 1);
+      tree scope, member;
+      if (code == SCOPE_REF)
+       {
+         scope = TREE_OPERAND (expr, 0);
+         member = TREE_OPERAND (expr, 1);
+       }
+      else
+       {
+         scope = BINFO_TYPE (BASELINK_ACCESS_BINFO (expr));
+         member = BASELINK_FUNCTIONS (expr);
+       }
 
       if (!abi_version_at_least (2) && DECL_P (member))
        {
index f9e1a1308afabad99eeaeb2118d571d0aa155852..4c853552f4f4e67d2dea621e9d4b72d953b73540 100644 (file)
@@ -6045,9 +6045,9 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser,
              parser->qualifying_scope = NULL_TREE;
              parser->object_scope = NULL_TREE;
            }
-         if (scope && name && BASELINK_P (name))
+         if (parser->scope && name && BASELINK_P (name))
            adjust_result_of_qualified_name_lookup
-             (name, BINFO_TYPE (BASELINK_ACCESS_BINFO (name)), scope);
+             (name, parser->scope, scope);
          postfix_expression
            = finish_class_member_access_expr (postfix_expression, name,
                                               template_p, 
index 45fdafc37237f7e4977aea4d28451a68dd740d7e..e48dcec05890c739c0163313fd18f98d57773662 100644 (file)
@@ -1550,6 +1550,9 @@ adjust_result_of_qualified_name_lookup (tree decl,
        }
     }
 
+  if (BASELINK_P (decl))
+    BASELINK_QUALIFIED_P (decl) = true;
+
   return decl;
 }
 
index 8ef3e2540cdabd74ebdcccd4a39d0d20d51a13e5..bf8bc05fff2fe224222fbbbb78f356efa8ea8461 100644 (file)
@@ -2320,6 +2320,7 @@ cp_tree_equal (tree t1, tree t2)
     case BASELINK:
       return (BASELINK_BINFO (t1) == BASELINK_BINFO (t2)
              && BASELINK_ACCESS_BINFO (t1) == BASELINK_ACCESS_BINFO (t2)
+             && BASELINK_QUALIFIED_P (t1) == BASELINK_QUALIFIED_P (t2)
              && cp_tree_equal (BASELINK_FUNCTIONS (t1),
                                BASELINK_FUNCTIONS (t2)));
 
index 53dda864d66f3dac5491f0eed8e5260e9fe5dcf1..224f98f0e709a782cdbe64c806b6d1511c69722d 100644 (file)
@@ -1,5 +1,9 @@
 2012-01-12  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48051
+       * g++.dg/abi/mangle48.C: Test qualified-names, too.
+       * g++.dg/abi/mangle58.C: Likewise.
+
        PR c++/51403
        * g++.dg/template/arg8.C: New.
 
index dc9c492cf003037a833457466a37fab943ed63c8..6c0e99c8de89c1908594d40665b6c016ef16e970 100644 (file)
@@ -13,6 +13,10 @@ struct A
   template <class U> auto f() -> decltype (b.f<U>());
   // { dg-final { scan-assembler "_ZN1A1gIiEEDTcldtptfpT1b1fIT_EEEv" } }
   template <class U> auto g() -> decltype (this->b.f<U>());
+  // { dg-final { scan-assembler "_ZN1A1hIiEEDTcldtdtdefpT1bsr1B1fIT_EEEv" } }
+  template <class U> auto h() -> decltype (b.B::f<U>());
+  // { dg-final { scan-assembler "_ZN1A1iIiEEDTcldtptfpT1bsr1B1fIT_EEEv" } }
+  template <class U> auto i() -> decltype (this->b.B::f<U>());
 };
 
 int main()
@@ -20,4 +24,6 @@ int main()
   A a;
   a.f<int>();
   a.g<int>();
+  a.h<int>();
+  a.i<int>();
 }
index 14e5543d9f24e5409dd108ac672bf09757839082..54b16f25699dea94b71871806c05ebbd3690d8b5 100644 (file)
@@ -6,14 +6,20 @@ struct B {
   static int cmp2(char a, char b);
   // { dg-final { scan-assembler "_ZN1B1fIcEEvR1AIT_X4cmp1EE" } }
   template <typename T> static void f (A<T,cmp1> &);
+  // { dg-final { scan-assembler "_ZN1B1gIcEEvR1AIT_XsrS_4cmp1EE" } }
+  template <typename T> static void g (A<T,B::cmp1> &);
   // { dg-final { scan-assembler "_ZN1B1fIcEEvR1AIT_L_ZNS_4cmp2EccEE" } }
   template <typename T> static void f (A<T,cmp2> &);
+  // { dg-final { scan-assembler "_ZN1B1gIcEEvR1AIT_L_ZNS_4cmp2EccEE" } }
+  template <typename T> static void g (A<T,B::cmp2> &);
 };
 
 void g()
 {
   A<char,B::cmp1> a;
   B::f(a);
+  B::g(a);
   A<char,B::cmp2> a2;
   B::f(a2);
+  B::g(a2);
 }