auto foo() {}
It is a function declaration with return type inference, but surprisingly, the syntax does not match any documented grammar rule.
Decl:
StorageClasses_opt BasicType Declarators ;
StorageClasses_opt BasicType Declarator FunctionBody
--> BasicType is not optional, so cannot match
AutoDeclaration:
StorageClasses AutoDeclarationX ;
AutoDeclarationX:
Identifier TemplateParametersopt = Initializer
AutoDeclarationX , Identifier TemplateParametersopt = Initializer
--> This is for variable declarations with type inference, not for function declaration.
So, the specification should have one more non-terminal symbol AutoFuncDeclaration, as follows:
AutoFuncDeclaration:
StorageClasses Identifier FuncDeclaratorSuffix FunctionBody
FuncDeclaratorSuffix:
Parameters MemberFunctionAttributes_opt
TemplateParameters Parameters MemberFunctionAttributes_opt Constraint_opt