-
Notifications
You must be signed in to change notification settings - Fork 14.6k
Open
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzillac11clang:frontendLanguage frontend issues, e.g. anything involving "Sema"Language frontend issues, e.g. anything involving "Sema"confirmedVerified by a second partyVerified by a second partyrejects-valid
Description
Bugzilla Link | 40147 |
Version | trunk |
OS | All |
CC | @pascal-cuoq,@hfinkel,@zygoloid |
Extended Description
Test case (prog.c):
int main()
{
typedef const int t();
typedef int t();
}
Compilation command line:
clang prog.c -Wall -Wextra -std=c11 -pedantic-errors
Observed behaviour:
The following error message was outputed:
error: typedef redefinition with different types ('int ()' vs
'const int ()') typedef int t();
Expected behaviour:
No error message. Both typedefs should define t to be of type 'int ()' since
function types never have qualified return types.
Standard references:
6.7.6.3.5
Note:
gcc does not give any errors for the program.
Metadata
Metadata
Assignees
Labels
bugzillaIssues migrated from bugzillaIssues migrated from bugzillac11clang:frontendLanguage frontend issues, e.g. anything involving "Sema"Language frontend issues, e.g. anything involving "Sema"confirmedVerified by a second partyVerified by a second partyrejects-valid
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
zygoloid commentedon Dec 23, 2018
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).
yeah-boi commentedon Dec 24, 2018
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:
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
zygoloid commentedon Dec 24, 2018
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.
llvmbot commentedon Jun 18, 2023
@llvm/issue-subscribers-c11
llvmbot commentedon Jun 18, 2023
@llvm/issue-subscribers-clang-frontend