aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-09-19 20:55:14 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-09-19 20:55:14 -0400
commite2254932f9afd2a0864330dbf37522c99f3ab3f6 (patch)
tree81d5756ec6e9db2cfaf1d6a63a1b19a80282659b /gcc
parent207fd2123a05b4d163c949e3cad0fd293d4f45b4 (diff)
downloadgcc-e2254932f9afd2a0864330dbf37522c99f3ab3f6.zip
gcc-e2254932f9afd2a0864330dbf37522c99f3ab3f6.tar.gz
gcc-e2254932f9afd2a0864330dbf37522c99f3ab3f6.tar.bz2
re PR c++/61392 (internal compiler error: in write_template_arg_literal, at cp/mangle.c:3072)
PR c++/61392 * mangle.c (write_expression): Use unresolved-name mangling for DR850 case. From-SVN: r215414
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/mangle.c11
-rw-r--r--gcc/cp/semantics.c2
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle63.C11
4 files changed, 24 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f5092fb..2b53728 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index 283983f..9703d1c 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -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;
}
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index bcf161b..1d81028 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -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
index 0000000..d6a58a3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle63.C
@@ -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" } }