From 4bbff96e369cf96ee1c6bd3fd9f7728c08e05da8 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 1 Aug 2011 17:02:07 -0400 Subject: re PR c++/49932 ([C++0x] ICE on instantiating decltype(expr)::type with template) PR c++/49932 gcc/cp/ * mangle.c (write_prefix): Handle decltype. libiberty/ * cp-demangle.c (d_prefix): Handle decltype. From-SVN: r177074 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/mangle.c | 7 +++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/abi/mangle49.C | 22 ++++++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 gcc/testsuite/g++.dg/abi/mangle49.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6dda726..4ce77d4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-08-01 Jason Merrill + PR c++/49932 + * mangle.c (write_prefix): Handle decltype. + PR c++/49924 * semantics.c (cxx_eval_vec_init_1): Fix logic. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 4a83c9a..eb3f144 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -952,6 +952,7 @@ write_nested_name (const tree decl) /* ::= ::= ::= + ::= ::= # empty ::= */ @@ -968,6 +969,12 @@ write_prefix (const tree node) MANGLE_TRACE_TREE ("prefix", node); + if (TREE_CODE (node) == DECLTYPE_TYPE) + { + write_type (node); + return; + } + if (find_substitution (node)) return; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e362644..4ff8a10 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-08-01 Jason Merrill + PR c++/49932 + * g++.dg/abi/mangle49.C: New. + PR c++/49924 * g++.dg/cpp0x/constexpr-array4.C: New. diff --git a/gcc/testsuite/g++.dg/abi/mangle49.C b/gcc/testsuite/g++.dg/abi/mangle49.C new file mode 100644 index 0000000..a258dc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle49.C @@ -0,0 +1,22 @@ +// PR c++/49932 +// { dg-options "-std=c++0x -fabi-version=0" } + +template < typename T > +auto +f1( T x ) // ICE on here + -> typename decltype( x )::type {} + +template < typename T > +typename decltype( T() )::type +f2( T x ) {} // ICE on here + +struct S { typedef void type; }; + +void g() +{ + f1( S() ); + f2( S() ); +} + +// { dg-final { scan-assembler "_Z2f1I1SENDtfp_E4typeET_" } } +// { dg-final { scan-assembler "_Z2f2I1SENDTcvT__EE4typeES1_" } } -- cgit v1.1