Open Quuxplusone opened 5 years ago
Bugzilla Link | PR40147 |
Status | NEW |
Importance | P normal |
Reported by | Anders Granlund (anders.granlund.0@gmail.com) |
Reported on | 2018-12-23 07:13:17 -0800 |
Last modified on | 2019-03-12 09:00:21 -0700 |
Version | trunk |
Hardware | All All |
CC | cuoq@trust-in-soft.com, hfinkel@anl.gov, htmldeveloper@gmail.com, llvm-bugs@lists.llvm.org, neeilans@live.com, richard-llvm@metafoo.co.uk |
Fixed by commit(s) | |
Attachments | |
Blocks | |
Blocked by | |
See also |
> Standard references:
>
> 6.7.6.3.5
Do you mean 6.7.6.3/5? That seems to justify Clang's current behavior:
"If, in the declaration ‘‘T D1’’, D1 has the form D( parameter-type-list ) or
D( identifier-list[opt] ) and the type specified for ident in the declaration
‘‘T D’’ is ‘‘derived-declarator-type-list T’’, then the type specified for
ident is ‘‘derived-declarator-type-list function returning T’’."
... which says that the first typedef declares t as ‘‘function returning const
int’’ and the second typedef declares t as ‘‘function returning int’’.
Moreover, 6.7.6.3/15 says
"For two function types to be compatible, both shall specify compatible return
types."
(And 6.7.3/10: "For two qualified types to be compatible, both shall have the
identically qualified version of a compatible type;")
As far as I can see, Clang is correct here: type-qualifiers on the return type
are part of the function type and are not ignored when determining whether two
function types are compatible.
So I think this is a GCC bug (or maybe extension).
Yes, 6.7.6.3/5.
I have look at the standard again now and it seems like there is a difference
between the C11 standard and the C17 (the bugfix for C11).
In the C11 standard 6.7.6.3/5 looks like the way you quoted, but in the C17 (
the bugfix for C11) looks it like the following:
If, in the declaration “T D1”, D1 has the form D(parameter-type-list) or
D(identifier-list[opt]) and the type specified for ident in the declaration
“T D” is “derived-declarator-type-list T”, then the type specified for ident
is “derived-declarator-type-list function returning the unqualified version of
T”.
So in the C11 standard the return type is stated to be "T", but in the C17
standard (the bugfix for C11) the return type is stated to be "the unqualified
version of T".
Latest draft of the C17 standard (the bugfix for C11):
http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
Thanks, this is C11 DR 423:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/summary.htm#dr_423
... which Clang evidently does not yet implement.