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:
parent
f88d07724f
commit
92f6fd0b80
@ -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.
|
||||
|
10
gcc/c-decl.c
10
gcc/c-decl.c
@ -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
|
||||
|
32
gcc/testsuite/gcc.dg/vla-19.c
Normal file
32
gcc/testsuite/gcc.dg/vla-19.c
Normal file
@ -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" } */
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user