From: Paolo Carlini Date: Thu, 5 Apr 2018 17:05:03 +0000 (+0000) Subject: re PR c++/84792 (ICE with broken typedef of a struct) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3b4a12aa8a7c7298c0b6277dad82e1dd95857eb8;p=gcc.git re PR c++/84792 (ICE with broken typedef of a struct) /cp 2018-04-05 Paolo Carlini PR c++/84792 * decl.c (grokdeclarator): Fix diagnostic about typedef name used as nested-name-specifier, keep type and TREE_TYPE (decl) in sync. /testsuite 2018-04-05 Paolo Carlini PR c++/84792 * g++.dg/other/pr84792-1.C: New. * g++.dg/other/pr84792-2.C: Likewise. From-SVN: r259136 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a876dc9bffd..0d60ed00a7d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-04-05 Paolo Carlini + + PR c++/84792 + * decl.c (grokdeclarator): Fix diagnostic about typedef name used + as nested-name-specifier, keep type and TREE_TYPE (decl) in sync. + 2018-04-05 Jason Merrill PR c++/82152 - ICE with class deduction and inherited ctor. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index b2e509e4d05..489dcc0a8ed 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11766,15 +11766,16 @@ grokdeclarator (const cp_declarator *declarator, if (reqs) error_at (location_of (reqs), "requires-clause on typedef"); + if (id_declarator && declarator->u.id.qualifying_scope) + { + error ("typedef name may not be a nested-name-specifier"); + type = error_mark_node; + } + if (decl_context == FIELD) decl = build_lang_decl (TYPE_DECL, unqualified_id, type); else decl = build_decl (input_location, TYPE_DECL, unqualified_id, type); - if (id_declarator && declarator->u.id.qualifying_scope) { - error_at (DECL_SOURCE_LOCATION (decl), - "typedef name may not be a nested-name-specifier"); - TREE_TYPE (decl) = error_mark_node; - } if (decl_context != FIELD) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 45fecfb27bf..a94044ebc3a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-04-05 Paolo Carlini + + PR c++/84792 + * g++.dg/other/pr84792-1.C: New. + * g++.dg/other/pr84792-2.C: Likewise. + 2018-04-05 Uros Bizjak PR target/85193 diff --git a/gcc/testsuite/g++.dg/other/pr84792-1.C b/gcc/testsuite/g++.dg/other/pr84792-1.C new file mode 100644 index 00000000000..23df8ae18ad --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr84792-1.C @@ -0,0 +1,6 @@ +struct A {}; + +typedef struct +{ + virtual void foo() {} +} A::B; // { dg-error "typedef" } diff --git a/gcc/testsuite/g++.dg/other/pr84792-2.C b/gcc/testsuite/g++.dg/other/pr84792-2.C new file mode 100644 index 00000000000..a393d5771ce --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr84792-2.C @@ -0,0 +1,6 @@ +struct A {}; + +typedef struct +{ + void foo() {} +} A::B; // { dg-error "typedef" }