re PR c++/37967 (ICE with function returning auto)

PR c++/37967
	* decl.c (grokdeclarator): Diagnose auto function decl without
	late return type and late return type function decl where type
	is not auto.

	* g++.dg/cpp0x/auto8.C: New test.

From-SVN: r141502
This commit is contained in:
Jakub Jelinek 2008-10-31 22:33:47 +01:00 committed by Jakub Jelinek
parent 0a3098bba1
commit 4f48b9c1a5
4 changed files with 52 additions and 4 deletions

View File

@ -1,5 +1,10 @@
2008-10-31 Jakub Jelinek <jakub@redhat.com>
PR c++/37967
* decl.c (grokdeclarator): Diagnose auto function decl without
late return type and late return type function decl where type
is not auto.
PR c++/37965
* decl.c (cp_finish_decl): Diagnose type_uses_auto type with
no initializer.

View File

@ -8237,16 +8237,40 @@ grokdeclarator (const cp_declarator *declarator,
/* Pick up the exception specifications. */
raises = declarator->u.function.exception_specification;
/* Say it's a definition only for the CALL_EXPR
closest to the identifier. */
funcdecl_p = inner_declarator && inner_declarator->kind == cdk_id;
/* Handle a late-specified return type. */
if (funcdecl_p)
{
if (type_uses_auto (type))
{
if (!declarator->u.function.late_return_type)
{
error ("%qs function uses auto type specifier without"
" late return type", name);
return error_mark_node;
}
else if (!is_auto (type))
{
error ("%qs function with late return type not using"
" auto type specifier as its type", name);
return error_mark_node;
}
}
else if (declarator->u.function.late_return_type)
{
error ("%qs function with late return type not declared"
" with auto type specifier", name);
return error_mark_node;
}
}
type = splice_late_return_type
(type, declarator->u.function.late_return_type);
if (type == error_mark_node)
return error_mark_node;
/* Say it's a definition only for the CALL_EXPR
closest to the identifier. */
funcdecl_p = inner_declarator && inner_declarator->kind == cdk_id;
if (ctype == NULL_TREE
&& decl_context == FIELD
&& funcdecl_p

View File

@ -1,5 +1,8 @@
2008-10-31 Jakub Jelinek <jakub@redhat.com>
PR c++/37967
* g++.dg/cpp0x/auto8.C: New test.
PR c++/37965
* g++.dg/cpp0x/auto7.C: New test.

View File

@ -0,0 +1,16 @@
// PR c++/37967
// Negative test for auto
// { dg-options "-std=c++0x" }
auto f1 () -> int;
auto f2 (); // { dg-error "without late return type" }
int f3 () -> int; // { dg-error "with auto type specifier" }
auto *f4 () -> int; // { dg-error "not using auto" }
struct A
{
auto f5 () const -> int;
auto f6 (); // { dg-error "without late return type" }
int f7 () -> int; // { dg-error "with auto type specifier" }
auto *f8 () -> int; // { dg-error "not using auto" }
};