re PR c++/61392 (internal compiler error: in write_template_arg_literal, at cp/mangle...
authorJason Merrill <jason@redhat.com>
Sat, 20 Sep 2014 00:55:14 +0000 (20:55 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 20 Sep 2014 00:55:14 +0000 (20:55 -0400)
PR c++/61392
* mangle.c (write_expression): Use unresolved-name mangling for
DR850 case.

From-SVN: r215414

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/abi/mangle63.C [new file with mode: 0644]

index f5092fb14c56776102e2cf03a37f934c1898e0c2..2b537281e72916c62157950155acd4443f324532 100644 (file)
@@ -1,5 +1,9 @@
 2014-09-19  Jason Merrill  <jason@redhat.com>
 
+       PR c++/61392
+       * mangle.c (write_expression): Use unresolved-name mangling for
+       DR850 case.
+
        PR c++/61465
        * call.c (convert_like_real) [ck_identity]: Call mark_rvalue_use
        after pulling out an element from a CONSTRUCTOR.
index 283983fbe02c066ea7aef89f22f04b221f5ca86b..9703d1ceb726b0bb86dc56d5846cdf4013b62d0b 100644 (file)
@@ -2861,11 +2861,16 @@ write_expression (tree expr)
            {
              write_string (operator_name_info[(int)code].mangled_name);
              ob = TREE_OPERAND (ob, 0);
+             write_expression (ob);
            }
-         else
-           write_string ("dt");
+         else if (!is_dummy_object (ob))
+           {
+             write_string ("dt");
+             write_expression (ob);
+           }
+         /* else, for a non-static data member with no associated object (in
+            unevaluated context), use the unresolved-name mangling.  */
 
-         write_expression (ob);
          write_member_name (TREE_OPERAND (expr, 1));
          return;
        }
index bcf161bd921cfd81e249219ef184f1526ee223a1..1d81028dc2169a129419182f9413d37d8bf499c9 100644 (file)
@@ -1685,7 +1685,7 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
   if (object == error_mark_node)
     return error_mark_node;
 
-  /* DR 613: Can use non-static data members without an associated
+  /* DR 613/850: Can use non-static data members without an associated
      object in sizeof/decltype/alignof.  */
   if (is_dummy_object (object) && cp_unevaluated_operand == 0
       && (!processing_template_decl || !current_class_ref))
diff --git a/gcc/testsuite/g++.dg/abi/mangle63.C b/gcc/testsuite/g++.dg/abi/mangle63.C
new file mode 100644 (file)
index 0000000..d6a58a3
--- /dev/null
@@ -0,0 +1,11 @@
+// DR 850 makes this valid
+// { dg-do compile { target c++11 } }
+
+template<class T> struct A
+{
+  int mem;
+  template<class U> decltype(U()+mem) f();
+};
+int i = A<int>().f<int>();
+
+// { dg-final { scan-assembler "_ZN1AIiE1fIiEEDTplcvT__E3memEv" } }