From: Paolo Carlini Date: Wed, 6 Mar 2013 23:47:20 +0000 (+0000) Subject: re PR c++/56534 (ICE Segfault on invalid code in check_elaborated_type_specifier) X-Git-Tag: releases/gcc-4.8.0~152 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5fdbceff85d56d29b79bb5746930e6d7af861c65;p=thirdparty%2Fgcc.git re PR c++/56534 (ICE Segfault on invalid code in check_elaborated_type_specifier) /cp 2013-03-06 Paolo Carlini PR c++/56534 * parser.c (cp_parser_elaborated_type_specifier): Don't call check_elaborated_type_specifier when TREE_CODE (decl) != TYPE_DECL. * decl.c (check_elaborated_type_specifier): Tidy. /testsuite 2013-03-06 Paolo Carlini PR c++/56534 * g++.dg/template/crash115.C: New. From-SVN: r196513 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8a5923459107..49e0f51bdec7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2013-03-06 Paolo Carlini + + PR c++/56534 + * parser.c (cp_parser_elaborated_type_specifier): Don't call + check_elaborated_type_specifier when TREE_CODE (decl) != TYPE_DECL. + * decl.c (check_elaborated_type_specifier): Tidy. + 2013-03-06 Jakub Jelinek PR c++/56543 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 40ab0bdee986..150e8662a5e2 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11712,9 +11712,6 @@ 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; }; diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 97e610ce79f9..ff4faa32d3c7 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -14248,12 +14248,14 @@ cp_parser_elaborated_type_specifier (cp_parser* parser, typename_type, /*complain=*/tf_error); /* If the `typename' keyword is in effect and DECL is not a type - decl. Then type is non existant. */ + decl, then type is non existent. */ else if (tag_type == typename_type && TREE_CODE (decl) != TYPE_DECL) - type = NULL_TREE; - else - type = check_elaborated_type_specifier (tag_type, decl, + ; + else if (TREE_CODE (decl) == TYPE_DECL) + type = check_elaborated_type_specifier (tag_type, decl, /*allow_template_p=*/true); + else if (decl == error_mark_node) + type = error_mark_node; } if (!type) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e6886367798..1979d3247268 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-03-06 Paolo Carlini + + PR c++/56534 + * g++.dg/template/crash115.C: New. + 2013-03-06 Jakub Jelinek PR tree-optimization/56539 diff --git a/gcc/testsuite/g++.dg/template/crash115.C b/gcc/testsuite/g++.dg/template/crash115.C new file mode 100644 index 000000000000..5c9f525cd647 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash115.C @@ -0,0 +1,3 @@ +// PR c++/56534 + +template < struct template rebind < > // { dg-error "expected" }