diff options
author | Jason Merrill <jason@redhat.com> | 2011-08-01 17:02:07 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-08-01 17:02:07 -0400 |
commit | 4bbff96e369cf96ee1c6bd3fd9f7728c08e05da8 (patch) | |
tree | e2466ac7db646acfd78689bc5c745b698c31ba6f | |
parent | 3748a54ca39e4aa0d38cec50b8e8ee7b7a93df09 (diff) | |
download | gcc-4bbff96e369cf96ee1c6bd3fd9f7728c08e05da8.zip gcc-4bbff96e369cf96ee1c6bd3fd9f7728c08e05da8.tar.gz gcc-4bbff96e369cf96ee1c6bd3fd9f7728c08e05da8.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle49.C | 22 | ||||
-rw-r--r-- | libiberty/ChangeLog | 6 | ||||
-rw-r--r-- | libiberty/cp-demangle.c | 14 | ||||
-rw-r--r-- | libiberty/testsuite/demangle-expected | 4 |
7 files changed, 57 insertions, 2 deletions
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 <jason@redhat.com> + 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) /* <prefix> ::= <prefix> <unqualified-name> ::= <template-param> ::= <template-prefix> <template-args> + ::= <decltype> ::= # empty ::= <substitution> */ @@ -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 <jason@redhat.com> + 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_" } } diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 2c5b761..b88399e 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,9 @@ +2011-08-01 Jason Merrill <jason@redhat.com> + + PR c++/49932 + * cp-demangle.c (d_prefix): Handle decltype. + * testsuite/demangle-expected: Test it. + 2011-07-26 H.J. Lu <hongjiu.lu@intel.com> * testsuite/demangle-expected: Remove an extra line. diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index f41856b..d67a9e7 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -1280,6 +1280,7 @@ d_nested_name (struct d_info *di) /* <prefix> ::= <prefix> <unqualified-name> ::= <template-prefix> <template-args> ::= <template-param> + ::= <decltype> ::= ::= <substitution> @@ -1308,10 +1309,19 @@ d_prefix (struct d_info *di) <template-param> here. */ comb_type = DEMANGLE_COMPONENT_QUAL_NAME; - if (IS_DIGIT (peek) + if (peek == 'D') + { + char peek2 = d_peek_next_char (di); + if (peek2 == 'T' || peek2 == 't') + /* Decltype. */ + dc = cplus_demangle_type (di); + else + /* Destructor name. */ + dc = d_unqualified_name (di); + } + else if (IS_DIGIT (peek) || IS_LOWER (peek) || peek == 'C' - || peek == 'D' || peek == 'U' || peek == 'L') dc = d_unqualified_name (di); diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index f9e8447..3737cfd 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -3901,6 +3901,10 @@ java resource java/util/iso4217.properties --format=gnu-v3 _Z3addIidEDTplfp_fp0_ET_T0_ decltype ({parm#1}+{parm#2}) add<int, double>(int, double) +# decltype scope test +--format=gnu-v3 +_Z1fI1SENDtfp_E4typeET_ +decltype ({parm#1})::type f<S>(S) # decltype/fn call test --format=gnu-v3 _Z4add3IidEDTclL_Z1gEfp_fp0_EET_T0_ |