From 82daaf6d550e9380e33f802310b52c2af1758ff0 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Wed, 23 Nov 2011 08:23:59 +0000 Subject: [PATCH] PR c++/51145 - Alias template in elaborated-type-specifier accepted gcc/cp/ PR c++/51145 * decl.c (check_elaborated_type_specifier): Gracefully handle error_mark_node. Accept bound template template parameters. Update diagnostics for alias template specializations. Update comment. * parser.c (cp_parser_elaborated_type_specifier): Use check_elaborated_type_specifier for simple-template-ids as well. gcc/testsuite/ PR c++/51145 * g++.dg/cpp0x/alias-decl-14.C: New test. * g++.dg/cpp0x/alias-decl-2.C: Adjust for tests that were wrongly passing before. * g++.dg/cpp0x/alias-decl-10.C: Likewise and adjust for diagnostic change. * g++.dg/ext/attrib27.C: Adjust for diagnostic change. * g++.dg/lookup/struct1.C: Likewise. * g++.dg/parse/elab1.C: Likewise. * g++.dg/parse/elab2.C: Likewise. * g++.dg/parse/int-as-enum1.C: Likewise. * g++.dg/parse/typedef1.C: Likewise. * g++.dg/parse/typedef3.C: Likewise. * g++.dg/parse/typedef4.C: Likewise. * g++.dg/parse/typedef5.C: Likewise. * g++.dg/template/crash26.C: Likewise. * g++.dg/template/nontype4.C: Likewise. * g++.old-deja/g++.benjamin/typedef01.C: Likewise. * g++.old-deja/g++.brendan/line1.C: Likewise. * g++.old-deja/g++.other/elab1.C: Likewise. * g++.old-deja/g++.other/syntax4.C: Likewise. From-SVN: r181653 --- gcc/cp/ChangeLog | 10 ++++++++ gcc/cp/decl.c | 21 ++++++++++++---- gcc/cp/parser.c | 3 ++- gcc/testsuite/ChangeLog | 24 +++++++++++++++++++ gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C | 16 +++++++++---- gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C | 14 +++++++++++ gcc/testsuite/g++.dg/cpp0x/alias-decl-2.C | 2 +- gcc/testsuite/g++.dg/ext/attrib27.C | 2 +- gcc/testsuite/g++.dg/lookup/struct1.C | 4 ++-- gcc/testsuite/g++.dg/parse/elab1.C | 2 +- gcc/testsuite/g++.dg/parse/elab2.C | 2 +- gcc/testsuite/g++.dg/parse/int-as-enum1.C | 2 +- gcc/testsuite/g++.dg/parse/typedef1.C | 2 +- gcc/testsuite/g++.dg/parse/typedef3.C | 2 +- gcc/testsuite/g++.dg/parse/typedef4.C | 2 +- gcc/testsuite/g++.dg/parse/typedef5.C | 2 +- gcc/testsuite/g++.dg/template/crash26.C | 2 +- gcc/testsuite/g++.dg/template/nontype4.C | 2 +- .../g++.old-deja/g++.benjamin/typedef01.C | 4 ++-- .../g++.old-deja/g++.brendan/line1.C | 2 +- gcc/testsuite/g++.old-deja/g++.other/elab1.C | 2 +- .../g++.old-deja/g++.other/syntax4.C | 2 +- 22 files changed, 97 insertions(+), 27 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/alias-decl-14.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9d8f47b8666..6833fc390f2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2011-11-22 Dodji Seketeli + + PR c++/51145 + * decl.c (check_elaborated_type_specifier): Gracefully handle + error_mark_node. Accept bound template template parameters. + Update diagnostics for alias template specializations. Update + comment. + * parser.c (cp_parser_elaborated_type_specifier): Use + check_elaborated_type_specifier for simple-template-ids as well. + 2011-11-22 Paolo Carlini PR c++/51265 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index b77963b72df..84064326f4d 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11342,6 +11342,9 @@ check_elaborated_type_specifier (enum tag_types tag_code, { tree type; + if (decl == error_mark_node) + return error_mark_node; + /* In the case of: struct S { struct S *p; }; @@ -11361,10 +11364,15 @@ check_elaborated_type_specifier (enum tag_types tag_code, type, tag_name (tag_code)); return error_mark_node; } + /* Accept bound template template parameters. */ + else if (allow_template_p + && TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM) + ; /* [dcl.type.elab] - If the identifier resolves to a typedef-name or a template - type-parameter, the elaborated-type-specifier is ill-formed. + If the identifier resolves to a typedef-name or the + simple-template-id resolves to an alias template + specialization, the elaborated-type-specifier is ill-formed. In other words, the only legitimate declaration to use in the elaborated type specifier is the implicit typedef created when @@ -11373,8 +11381,13 @@ check_elaborated_type_specifier (enum tag_types tag_code, && !DECL_SELF_REFERENCE_P (decl) && tag_code != typename_type) { - error ("using typedef-name %qD after %qs", decl, tag_name (tag_code)); - error ("%q+D has a previous declaration here", decl); + if (alias_template_specialization_p (type)) + error ("using alias template specialization %qT after %qs", + type, tag_name (tag_code)); + else + error ("using typedef-name %qD after %qs", decl, tag_name (tag_code)); + inform (DECL_SOURCE_LOCATION (decl), + "%qD has a previous declaration here", decl); return error_mark_node; } else if (TREE_CODE (type) != RECORD_TYPE diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d0adaa03c03..2fdd6753d08 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -13960,7 +13960,8 @@ cp_parser_elaborated_type_specifier (cp_parser* parser, else if (tag_type == typename_type && TREE_CODE (decl) != TYPE_DECL) type = NULL_TREE; else - type = TREE_TYPE (decl); + type = check_elaborated_type_specifier (tag_type, decl, + /*allow_template_p=*/true); } if (!type) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 27365e4eabc..9b3b01f97ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,27 @@ +2011-11-22 Dodji Seketeli + + PR c++/51145 + * g++.dg/cpp0x/alias-decl-14.C: New test. + * g++.dg/cpp0x/alias-decl-2.C: Adjust for tests that were wrongly + passing before. + * g++.dg/cpp0x/alias-decl-10.C: Likewise and adjust for diagnostic + change. + * g++.dg/ext/attrib27.C: Adjust for diagnostic change. + * g++.dg/lookup/struct1.C: Likewise. + * g++.dg/parse/elab1.C: Likewise. + * g++.dg/parse/elab2.C: Likewise. + * g++.dg/parse/int-as-enum1.C: Likewise. + * g++.dg/parse/typedef1.C: Likewise. + * g++.dg/parse/typedef3.C: Likewise. + * g++.dg/parse/typedef4.C: Likewise. + * g++.dg/parse/typedef5.C: Likewise. + * g++.dg/template/crash26.C: Likewise. + * g++.dg/template/nontype4.C: Likewise. + * g++.old-deja/g++.benjamin/typedef01.C: Likewise. + * g++.old-deja/g++.brendan/line1.C: Likewise. + * g++.old-deja/g++.other/elab1.C: Likewise. + * g++.old-deja/g++.other/syntax4.C: Likewise. + 2011-11-22 Tom de Vries PR rtl-optimization/50764 diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C index 856e4297af5..733e791c2bc 100644 --- a/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-10.C @@ -3,16 +3,24 @@ template using Ptr = T*; Ptr; // { dg-error "does not declare anything" } Ptr; // { dg-error "not a template|does not declare anything" } -template class Ptr;//{ dg-error "explicit instantiation|non-class templ|does not decl|anything" } +template class Ptr;//{ dg-error "alias template specialization\[^\n\r\]*after\[^\n\r\]*class" } template using Arg = T; struct A {}; -template class Arg;// { dg-error "explicit instantiation|non-class templ" } +template class Arg;// { dg-error "alias templ\[^\n\r\]*specialization\[^\n\r\]*Arg\[^\n\r\]*after\[^\n\r\]*class" } template