diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c/c-decl.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/call-diag-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/qual-return-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/qual-return-3.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/qual-return-4.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/qual-return-5.c | 32 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/qual-return-6.c | 12 |
9 files changed, 77 insertions, 7 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index af0bbe4..c726e9f 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,8 @@ +2016-05-13 Joseph Myers <joseph@codesourcery.com> + + * c-decl.c (grokdeclarator): For C11, discard qualifiers on + function return type. + 2016-05-12 Marek Polacek <polacek@redhat.com> PR c/70756 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 1926034..b2dd644 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -6106,20 +6106,35 @@ grokdeclarator (const struct c_declarator *declarator, qualify the return type, not the function type. */ if (type_quals) { + int quals_used = type_quals; /* Type qualifiers on a function return type are normally permitted by the standard but have no effect, so give a warning at -Wreturn-type. Qualifiers on a void return type are banned on function definitions in ISO C; GCC used to used - them for noreturn functions. */ - if (VOID_TYPE_P (type) && really_funcdef) + them for noreturn functions. The resolution of C11 + DR#423 means qualifiers (other than _Atomic) are + actually removed from the return type when + determining the function type. */ + if (flag_isoc11) + quals_used &= TYPE_QUAL_ATOMIC; + if (quals_used && VOID_TYPE_P (type) && really_funcdef) pedwarn (loc, 0, "function definition has qualified void return type"); else warning_at (loc, OPT_Wignored_qualifiers, "type qualifiers ignored on function return type"); - type = c_build_qualified_type (type, type_quals); + /* Ensure an error for restrict on invalid types; the + DR#423 resolution is not entirely clear about + this. */ + if (flag_isoc11 + && (type_quals & TYPE_QUAL_RESTRICT) + && (!POINTER_TYPE_P (type) + || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type)))) + error_at (loc, "invalid use of %<restrict%>"); + if (quals_used) + type = c_build_qualified_type (type, quals_used); } type_quals = TYPE_UNQUALIFIED; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7ef0797..9a8cd75 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-05-13 Joseph Myers <joseph@codesourcery.com> + + * gcc.dg/qual-return-5.c, gcc.dg/qual-return-6.c: New tests. + * gcc.dg/call-diag-2.c, gcc.dg/qual-return-2.c , + gcc.dg/qual-return-3.c, gcc.dg/qual-return-4.c: Use -std=gnu99. + 2016-05-13 Martin Sebor <msebor@redhat.com> PR c++/60049 diff --git a/gcc/testsuite/gcc.dg/call-diag-2.c b/gcc/testsuite/gcc.dg/call-diag-2.c index c34252c..b998ea9d 100644 --- a/gcc/testsuite/gcc.dg/call-diag-2.c +++ b/gcc/testsuite/gcc.dg/call-diag-2.c @@ -1,7 +1,7 @@ /* Test diagnostics for calling function returning qualified void or other incomplete type other than void. PR 35210. */ /* { dg-do compile } */ -/* { dg-options "-pedantic-errors" } */ +/* { dg-options "-std=gnu99 -pedantic-errors" } */ const void f_cv (void); struct s f_s (void); diff --git a/gcc/testsuite/gcc.dg/qual-return-2.c b/gcc/testsuite/gcc.dg/qual-return-2.c index 22a1946..1cd1253 100644 --- a/gcc/testsuite/gcc.dg/qual-return-2.c +++ b/gcc/testsuite/gcc.dg/qual-return-2.c @@ -1,7 +1,7 @@ /* Test for warnings for qualified function return types. -pedantic test. */ /* Origin: Joseph Myers <jsm28@cam.ac.uk> */ /* { dg-do compile } */ -/* { dg-options "-pedantic" } */ +/* { dg-options "-pedantic -std=gnu99" } */ /* Qualifying a function return type makes no sense. */ diff --git a/gcc/testsuite/gcc.dg/qual-return-3.c b/gcc/testsuite/gcc.dg/qual-return-3.c index e65f86d..bd76079 100644 --- a/gcc/testsuite/gcc.dg/qual-return-3.c +++ b/gcc/testsuite/gcc.dg/qual-return-3.c @@ -4,7 +4,7 @@ /* Origin: Joseph Myers <jsm@polyomino.org.uk> */ /* { dg-do compile } */ -/* { dg-options "" } */ +/* { dg-options "-std=gnu99" } */ int foo (); /* { dg-message "note: previous declaration" "different qualifiers" } */ const int foo () { return 0; } /* { dg-error "conflicting types" "different qualifiers" } */ diff --git a/gcc/testsuite/gcc.dg/qual-return-4.c b/gcc/testsuite/gcc.dg/qual-return-4.c index 9b61cfe..7bb5b69 100644 --- a/gcc/testsuite/gcc.dg/qual-return-4.c +++ b/gcc/testsuite/gcc.dg/qual-return-4.c @@ -3,7 +3,7 @@ types, not other such types within the definition. */ /* Origin: Joseph Myers <jsm@polyomino.org.uk> */ /* { dg-do compile } */ -/* { dg-options "-pedantic" } */ +/* { dg-options "-pedantic -std=gnu99" } */ volatile void (*y)(int); diff --git a/gcc/testsuite/gcc.dg/qual-return-5.c b/gcc/testsuite/gcc.dg/qual-return-5.c new file mode 100644 index 0000000..32a08f2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/qual-return-5.c @@ -0,0 +1,32 @@ +/* Test qualifiers on function return types after DR#423: those + qualifiers are now ignored for all purposes (but _Atomic is not, + for this purpose, a qualifier). */ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -pedantic-errors" } */ + +int f1 (void); +const int f1 (void); +volatile int f1 (void) { return 0; } + +int *restrict f2 (void) { return 0; } +int *f2 (void); + +const volatile long f3 (void); +long f3 (void); + +const volatile void f4 (void) { } +void f4 (void); + +_Atomic int f5 (void); /* { dg-message "previous declaration" } */ +int f5 (void); /* { dg-error "conflicting" } */ + +int f6 (void); /* { dg-message "previous declaration" } */ +_Atomic int f6 (void) { return 0; } /* { dg-error "conflicting" } */ + +/* The standard seems unclear regarding the case where restrict is + applied to a function return type that may not be + restrict-qualified; assume here that it is disallowed. */ +restrict int f7 (void); /* { dg-error "restrict" } */ + +typedef void FT (void); +FT *restrict f8 (void); /* { dg-error "restrict" } */ diff --git a/gcc/testsuite/gcc.dg/qual-return-6.c b/gcc/testsuite/gcc.dg/qual-return-6.c new file mode 100644 index 0000000..5b3ded0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/qual-return-6.c @@ -0,0 +1,12 @@ +/* Test qualifiers on function return types after DR#423: those + qualifiers are now ignored for all purposes (except that _Atomic + still affects the type), but should still get warnings. */ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -Wignored-qualifiers" } */ + +const int f1 (void); /* { dg-warning "qualifiers ignored" } */ +volatile int f2 (void) { return 0; } /* { dg-warning "qualifiers ignored" } */ +const volatile void f3 (void) { } /* { dg-warning "qualifiers ignored" } */ +const void f4 (void); /* { dg-warning "qualifiers ignored" } */ +_Atomic int f5 (void); /* { dg-warning "qualifiers ignored" } */ +_Atomic int f6 (void) { return 0; } /* { dg-warning "qualifiers ignored" } */ |