From: Jason Merrill Date: Fri, 12 Dec 2014 03:49:03 +0000 (-0500) Subject: re PR c++/64248 (Error: declarator-id missing; using reserved word ‘__FUNCTION__’) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8c7e9a616ecd878f0d58f19e65fe7a5b55a2b183;p=gcc.git re PR c++/64248 (Error: declarator-id missing; using reserved word ‘__FUNCTION__’) PR c++/64248 Revert: * parser.c (cp_parser_unqualified_id): Handle __func__ here. (cp_parser_primary_expression): Not here. From-SVN: r218654 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index be8f3a00cde..52b582d34cd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2014-12-11 Jason Merrill + PR c++/64248 + Revert: + * parser.c (cp_parser_unqualified_id): Handle __func__ here. + (cp_parser_primary_expression): Not here. + PR c++/57510 * typeck2.c (split_nonconstant_init_1): Handle arrays here. (store_init_value): Not here. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 48dd64a4c17..76725efde7d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -4503,9 +4503,39 @@ cp_parser_primary_expression (cp_parser *parser, case RID_FUNCTION_NAME: case RID_PRETTY_FUNCTION_NAME: case RID_C99_FUNCTION_NAME: + { + non_integral_constant name; + /* The symbols __FUNCTION__, __PRETTY_FUNCTION__, and - __func__ are the names of variables. */ - goto id_expression; + __func__ are the names of variables -- but they are + treated specially. Therefore, they are handled here, + rather than relying on the generic id-expression logic + below. Grammatically, these names are id-expressions. + + Consume the token. */ + token = cp_lexer_consume_token (parser->lexer); + + switch (token->keyword) + { + case RID_FUNCTION_NAME: + name = NIC_FUNC_NAME; + break; + case RID_PRETTY_FUNCTION_NAME: + name = NIC_PRETTY_FUNC; + break; + case RID_C99_FUNCTION_NAME: + name = NIC_C99_FUNC; + break; + default: + gcc_unreachable (); + } + + if (cp_parser_non_integral_constant_expression (parser, name)) + return error_mark_node; + + /* Look up the name. */ + return finish_fname (token->u.value); + } case RID_VA_ARG: { @@ -4926,7 +4956,6 @@ cp_parser_unqualified_id (cp_parser* parser, bool optional_p) { cp_token *token; - tree id; /* Peek at the next token. */ token = cp_lexer_peek_token (parser->lexer); @@ -4935,6 +4964,8 @@ cp_parser_unqualified_id (cp_parser* parser, { case CPP_NAME: { + tree id; + /* We don't know yet whether or not this will be a template-id. */ cp_parser_parse_tentatively (parser); @@ -5171,9 +5202,10 @@ cp_parser_unqualified_id (cp_parser* parser, } case CPP_KEYWORD: - switch (token->keyword) + if (token->keyword == RID_OPERATOR) { - case RID_OPERATOR: + tree id; + /* This could be a template-id, so we try that first. */ cp_parser_parse_tentatively (parser); /* Try a template-id. */ @@ -5203,19 +5235,6 @@ cp_parser_unqualified_id (cp_parser* parser, } return id; - - case RID_FUNCTION_NAME: - case RID_PRETTY_FUNCTION_NAME: - case RID_C99_FUNCTION_NAME: - cp_lexer_consume_token (parser->lexer); - /* Don't try to declare this while tentatively parsing a function - declarator, as cp_make_fname_decl will fail. */ - if (current_binding_level->kind != sk_function_parms) - finish_fname (token->u.value); - return token->u.value; - - default: - break; } /* Fall through. */ diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-func.C b/gcc/testsuite/g++.dg/cpp0x/decltype-func.C deleted file mode 100644 index 65dd27a87a4..00000000000 --- a/gcc/testsuite/g++.dg/cpp0x/decltype-func.C +++ /dev/null @@ -1,6 +0,0 @@ -// { dg-do compile { target c++11 } } - -void f() { - typedef decltype(__func__) T; - T x = __func__; // { dg-error "array" } -} diff --git a/gcc/testsuite/g++.dg/other/error34.C b/gcc/testsuite/g++.dg/other/error34.C index cb8fdaeec9d..d6f3eb590ea 100644 --- a/gcc/testsuite/g++.dg/other/error34.C +++ b/gcc/testsuite/g++.dg/other/error34.C @@ -4,4 +4,3 @@ S () : str(__PRETTY_FUNCTION__) {} // { dg-error "forbids declaration" "decl" } // { dg-error "only constructors" "constructor" { target *-*-* } 5 } -// { dg-prune-output "__PRETTY_FUNCTION__" } diff --git a/gcc/testsuite/g++.dg/parse/fnname2.C b/gcc/testsuite/g++.dg/parse/fnname2.C new file mode 100644 index 00000000000..7fc0f82707e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/fnname2.C @@ -0,0 +1,19 @@ +// PR c++/64248 + +class A +{ +public: + A(const char* str) {}; +}; + +class B +{ +public: + B(A a) {}; +}; + +int main() +{ + B b(A(__func__)); + return 0; +}