-
Notifications
You must be signed in to change notification settings - Fork 14.9k
Description
The following program demonstrates this issue:
int main(){
constexpr auto int x={};
}
This program is invalid because:
thread_local shall not appear in the declaration specifiers of a function declaration. auto shall only
appear in the declaration specifiers of an identifier with file scope or along with other storage-class
specifiers if the type is to be inferred from an initializer....
If auto appears with another storage-class specifier, or if it appears in a declaration at file scope, it is
ignored for the purposes of determining a storage duration or linkage. In this case, it indicates only
that the declared type may be inferred.
Section 6.7.2 "Storage-class specifiers" Paragraphs 4 and 15 ISO/IEC 9899:2024
constexpr
is a storage-class specifier, so here auto
is specifying type inference (and if it wasn't, it would violate the constraint in paragraph 4). I can't find any wording to say that using a type specifier with auto
for type inference is invalid, but {}
surely isn't valid with type inference. Note that Clang doesn't accept the following:
auto int x={};
int main(){}
GCC also doesn't accept either program.