diff options
author | Jason Merrill <jason@redhat.com> | 2014-09-19 20:55:14 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-09-19 20:55:14 -0400 |
commit | e2254932f9afd2a0864330dbf37522c99f3ab3f6 (patch) | |
tree | 81d5756ec6e9db2cfaf1d6a63a1b19a80282659b /gcc | |
parent | 207fd2123a05b4d163c949e3cad0fd293d4f45b4 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 11 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle63.C | 11 |
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" } } |