Delay check for prototype on __fastcall functions until after MergeFunctionDecl.
In C, it is only known after merging decls if a function with 0 arguments has
a prototype. Fixes PR20386, see that for more notes.
llvm-svn: 214408
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 9ce0928..4abbbebf 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -7821,6 +7821,18 @@
}
// Semantic checking for this function declaration (in isolation).
+
+ // Diagnose the use of X86 fastcall on unprototyped functions.
+ QualType NewQType = Context.getCanonicalType(NewFD->getType());
+ const FunctionType *NewType = cast<FunctionType>(NewQType);
+ if (isa<FunctionNoProtoType>(NewType)) {
+ FunctionType::ExtInfo NewTypeInfo = NewType->getExtInfo();
+ if (NewTypeInfo.getCC() == CC_X86FastCall)
+ Diag(NewFD->getLocation(), diag::err_cconv_knr)
+ << FunctionType::getNameForCallConv(CC_X86FastCall);
+ // TODO: Also diagnose unprototyped stdcall functions?
+ }
+
if (getLangOpts().CPlusPlus) {
// C++-specific checks.
if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(NewFD)) {