From: Jason Merrill Date: Fri, 7 Nov 2014 23:01:09 +0000 (-0500) Subject: parser.c (cp_parser_unqualified_id): Handle __func__ here. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=04af98c61b22d4bc647740299ff643d573ee28b6;p=gcc.git parser.c (cp_parser_unqualified_id): Handle __func__ here. * parser.c (cp_parser_unqualified_id): Handle __func__ here. (cp_parser_primary_expression): Not here. From-SVN: r217241 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index de04ab709b1..132b9e1b859 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2014-11-07 Jason Merrill + + * parser.c (cp_parser_unqualified_id): Handle __func__ here. + (cp_parser_primary_expression): Not here. + 2014-11-07 Thomas Preud'homme PR c++/63366 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e142f42a4db..e1b320ab1ab 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -4502,39 +4502,9 @@ 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 -- 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); - } + __func__ are the names of variables. */ + goto id_expression; case RID_VA_ARG: { @@ -4955,6 +4925,7 @@ 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); @@ -4963,8 +4934,6 @@ 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); @@ -5201,10 +5170,9 @@ cp_parser_unqualified_id (cp_parser* parser, } case CPP_KEYWORD: - if (token->keyword == RID_OPERATOR) + switch (token->keyword) { - tree id; - + case RID_OPERATOR: /* This could be a template-id, so we try that first. */ cp_parser_parse_tentatively (parser); /* Try a template-id. */ @@ -5234,6 +5202,16 @@ 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); + 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 new file mode 100644 index 00000000000..65dd27a87a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-func.C @@ -0,0 +1,6 @@ +// { 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 d6f3eb590ea..cb8fdaeec9d 100644 --- a/gcc/testsuite/g++.dg/other/error34.C +++ b/gcc/testsuite/g++.dg/other/error34.C @@ -4,3 +4,4 @@ S () : str(__PRETTY_FUNCTION__) {} // { dg-error "forbids declaration" "decl" } // { dg-error "only constructors" "constructor" { target *-*-* } 5 } +// { dg-prune-output "__PRETTY_FUNCTION__" }