parser.c (cp_parser_simple_declaration): Diagnose function declaration among more than one init-declarators with auto...
* parser.c (cp_parser_simple_declaration): Diagnose function declaration among more than one init-declarators with auto specifier. * g++.dg/cpp1y/auto-fn34.C: New test. From-SVN: r244071
This commit is contained in:
parent
066435fe10
commit
c9cf3863bd
4 changed files with 47 additions and 0 deletions
|
@ -1,5 +1,9 @@
|
|||
2017-01-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* parser.c (cp_parser_simple_declaration): Diagnose function
|
||||
declaration among more than one init-declarators with auto
|
||||
specifier.
|
||||
|
||||
PR c++/71182
|
||||
* parser.c (cp_lexer_previous_token): Use vec_safe_address in the
|
||||
assertion, as lexer->buffer may be NULL.
|
||||
|
|
|
@ -12723,8 +12723,17 @@ cp_parser_simple_declaration (cp_parser* parser,
|
|||
break;
|
||||
|
||||
tree last_type;
|
||||
bool auto_specifier_p;
|
||||
/* NULL_TREE if both variable and function declaration are allowed,
|
||||
error_mark_node if function declaration are not allowed and
|
||||
a FUNCTION_DECL that should be diagnosed if it is followed by
|
||||
variable declarations. */
|
||||
tree auto_function_declaration;
|
||||
|
||||
last_type = NULL_TREE;
|
||||
auto_specifier_p
|
||||
= decl_specifiers.type && type_uses_auto (decl_specifiers.type);
|
||||
auto_function_declaration = NULL_TREE;
|
||||
|
||||
/* Keep going until we hit the `;' at the end of the simple
|
||||
declaration. */
|
||||
|
@ -12770,6 +12779,26 @@ cp_parser_simple_declaration (cp_parser* parser,
|
|||
if (cp_parser_error_occurred (parser))
|
||||
goto done;
|
||||
|
||||
if (auto_specifier_p && cxx_dialect >= cxx14)
|
||||
{
|
||||
/* If the init-declarator-list contains more than one
|
||||
init-declarator, they shall all form declarations of
|
||||
variables. */
|
||||
if (auto_function_declaration == NULL_TREE)
|
||||
auto_function_declaration
|
||||
= TREE_CODE (decl) == FUNCTION_DECL ? decl : error_mark_node;
|
||||
else if (TREE_CODE (decl) == FUNCTION_DECL
|
||||
|| auto_function_declaration != error_mark_node)
|
||||
{
|
||||
error_at (decl_specifiers.locations[ds_type_spec],
|
||||
"non-variable %qD in declaration with more than one "
|
||||
"declarator with placeholder type",
|
||||
TREE_CODE (decl) == FUNCTION_DECL
|
||||
? decl : auto_function_declaration);
|
||||
auto_function_declaration = error_mark_node;
|
||||
}
|
||||
}
|
||||
|
||||
if (auto_result)
|
||||
{
|
||||
if (last_type && last_type != error_mark_node
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
2017-01-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* g++.dg/cpp1y/auto-fn34.C: New test.
|
||||
|
||||
PR c++/71182
|
||||
* g++.dg/cpp0x/pr71182.C: New test.
|
||||
|
||||
|
|
12
gcc/testsuite/g++.dg/cpp1y/auto-fn34.C
Normal file
12
gcc/testsuite/g++.dg/cpp1y/auto-fn34.C
Normal file
|
@ -0,0 +1,12 @@
|
|||
// { dg-do compile { target c++14 } }
|
||||
|
||||
auto f1 ();
|
||||
auto a = 5, f2 (); // { dg-error "in declaration with more than one declarator" }
|
||||
auto f3 (), b = 6; // { dg-error "in declaration with more than one declarator" }
|
||||
auto f4 (), f5 (), f6 (); // { dg-error "in declaration with more than one declarator" }
|
||||
auto f1 () { return 3; }
|
||||
auto f2 () { return 4; }
|
||||
auto f3 () { return 5; }
|
||||
auto f4 () { return 6; }
|
||||
auto f5 () { return 7; }
|
||||
auto f6 () { return 8; }
|
Loading…
Add table
Reference in a new issue