Commit 92f6fd0b by Joseph Myers Committed by Joseph Myers

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
parent f88d0772
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 &
......
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
* gcc.dg/c99-intconst-2.c: New test.
......
/* 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" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment