2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-26 07:40:26 +08:00

re PR c/39564 (variably modified function return types not always diagnosed)

PR c/39564
	* c-decl.c (grokdeclarator): Diagnose declarations of functions
	with variably modified return type and no storage class
	specifiers, except for the case of nested functions.  Distinguish
	extern declarations of functions with variably modified return
	types from those of objects with variably modified types.

testsuite:
	* gcc.dg/vla-19.c: New test.

From-SVN: r146778
This commit is contained in:
Joseph Myers 2009-04-25 19:55:50 +01:00 committed by Joseph Myers
parent f88d07724f
commit 92f6fd0b80
4 changed files with 54 additions and 2 deletions

@ -1,3 +1,12 @@
2009-04-25 Joseph Myers <joseph@codesourcery.com>
PR c/39564
* c-decl.c (grokdeclarator): Diagnose declarations of functions
with variably modified return type and no storage class
specifiers, except for the case of nested functions. Distinguish
extern declarations of functions with variably modified return
types from those of objects with variably modified types.
2009-04-25 Jan Hubicka <jh@suse.cz>
* tree.c (list_equal_p): New function.

@ -5012,11 +5012,17 @@ grokdeclarator (const struct c_declarator *declarator,
DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
}
if (storage_class == csc_extern
if ((storage_class == csc_extern
|| (storage_class == csc_none
&& TREE_CODE (type) == FUNCTION_TYPE
&& !funcdef_flag))
&& variably_modified_type_p (type, NULL_TREE))
{
/* C99 6.7.5.2p2 */
error ("object with variably modified type must have no linkage");
if (TREE_CODE (type) == FUNCTION_TYPE)
error ("non-nested function with variably modified type");
else
error ("object with variably modified type must have no linkage");
}
/* Record `register' declaration for warnings on &

@ -1,3 +1,8 @@
2009-04-25 Joseph Myers <joseph@codesourcery.com>
PR c/39564
* gcc.dg/vla-19.c: New test.
2009-04-25 Joseph Myers <joseph@codesourcery.com>
PR preprocessor/39559

@ -0,0 +1,32 @@
/* Test diagnostics for variably modified function return types. PR
39564. */
/* { dg-do compile } */
/* { dg-options "-std=c99" } */
int a;
void
f1 (void)
{
typedef int T[a];
extern T *g1 (void); /* { dg-error "non-nested function with variably modified type" } */
}
void
f2 (void)
{
extern int (*g2 (void))[a]; /* { dg-error "non-nested function with variably modified type" } */
}
void
f3 (void)
{
typedef int T[a];
T *g3 (void); /* { dg-error "non-nested function with variably modified type" } */
}
void
f4 (void)
{
int (*g4 (void))[a]; /* { dg-error "non-nested function with variably modified type" } */
}