From 777e426772f80cd101b49abb842ea621e89c433e Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Wed, 14 Aug 2019 08:50:55 +0000 Subject: [PATCH] decl.c (grokdeclarator): Check here for typedef a function definition or a member function definition. /cp 2019-08-14 Paolo Carlini * decl.c (grokdeclarator): Check here for typedef a function definition or a member function definition. (start_function): Adjust. (grokmethod): Likewise. /testsuite 2019-08-14 Paolo Carlini * g++.dg/parse/typedef9.C: Test locations too. From-SVN: r274431 --- gcc/cp/decl.c | 24 +++++++++++------------- gcc/testsuite/g++.dg/parse/typedef9.C | 4 ++-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index b849630e342..ff3b90dba54 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -12164,6 +12164,17 @@ grokdeclarator (const cp_declarator *declarator, bool alias_p = decl_spec_seq_has_spec_p (declspecs, ds_alias); tree decl; + if (funcdef_flag) + { + if (decl_context == NORMAL) + error_at (id_loc, + "typedef may not be a function definition"); + else + error_at (id_loc, + "typedef may not be a member function definition"); + return error_mark_node; + } + /* This declaration: typedef void f(int) const; @@ -15776,13 +15787,6 @@ start_function (cp_decl_specifier_seq *declspecs, invoke_plugin_callbacks (PLUGIN_START_PARSE_FUNCTION, decl1); if (decl1 == error_mark_node) return false; - /* If the declarator is not suitable for a function definition, - cause a syntax error. */ - if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) - { - error ("invalid function declaration"); - return false; - } if (DECL_MAIN_P (decl1)) /* main must return int. grokfndecl should have corrected it @@ -16437,12 +16441,6 @@ grokmethod (cp_decl_specifier_seq *declspecs, if (fndecl == error_mark_node) return error_mark_node; - if (fndecl == NULL || TREE_CODE (fndecl) != FUNCTION_DECL) - { - error ("invalid member function declaration"); - return error_mark_node; - } - if (attrlist) cplus_decl_attributes (&fndecl, attrlist, 0); diff --git a/gcc/testsuite/g++.dg/parse/typedef9.C b/gcc/testsuite/g++.dg/parse/typedef9.C index 7788f781fb6..2e7d672434b 100644 --- a/gcc/testsuite/g++.dg/parse/typedef9.C +++ b/gcc/testsuite/g++.dg/parse/typedef9.C @@ -1,8 +1,8 @@ // PR c++/38794 // { dg-do compile } -typedef void foo () {} // { dg-error "invalid function declaration" } +typedef void foo () {} // { dg-error "14:typedef may not be a function definition" } struct S { - typedef int bar (void) { return 0; } // { dg-error "invalid member function declaration" } + typedef int bar (void) { return 0; } // { dg-error "15:typedef may not be a member function definition" } }; -- 2.30.2