This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/81565] New: confusion between function and type attributes
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 26 Jul 2017 18:04:24 +0000
- Subject: [Bug c/81565] New: confusion between function and type attributes
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81565
Bug ID: 81565
Summary: confusion between function and type attributes
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
Attributes noreturn and warn_unused_result are both documented to apply to
functions and are not documented to apply to types. However, as the following
test case shows, while attribute noreturn is, in fact, a part of a function
declaration only and not its type, attribute warn_unused_result is also part of
the function's type and transfers to function pointers along with it. This
subtlety leads to confusion, surprising results, and bug reports about missing
or bogus warnings.
$ cat x.c && gcc -O2 -S -Wall -Wextra -Wpedantic x.c
int __attribute__ ((noreturn)) f0 (void);
int g0 (void)
{
__typeof__ (f0) *pf = f0;
pf ();
} // -Wreturn-type implies "noreturn" isn't part of f0's type.
int __attribute__ ((warn_unused_result)) f1 (void);
int f2 (void);
void g1 (void)
{
__typeof__ (f1) *pf = f1;
pf (); // -Wunused-result implies "warn_unused_result" is part of f1's type
pf = f2;
pf (); // bogus -Wunused-result
}
x.c: In function ‘g0’:
x.c:9:1: warning: control reaches end of non-void function [-Wreturn-type]
} // -Wreturn-type implies "noreturn" isn't part of f0's type.
^
x.c: In function ‘g1’:
x.c:19:3: warning: ignoring return value of function declared with attribute
warn_unused_result [-Wunused-result]
pf (); // -Wunused-result implies "warn_unused_result" is part of f1's
type
^~~~~
x.c:23:3: warning: ignoring return value of function declared with attribute
warn_unused_result [-Wunused-result]
pf (); // bogus -Wunused-result
^~~~~