Author: hans Date: Tue Oct 8 16:52:56 2013 New Revision: 192240 URL: http://llvm.org/viewvc/llvm-project?rev=192240&view=rev Log: Turn error about fastcall variadic function into warning in MS mode (PR12535)
MSVC allows this and silently falls back to __cdecl for variadic functions. This patch turns Clang's error into a warning in MS mode and adds a test to make sure we generate correct code. Differential Revision: http://llvm-reviews.chandlerc.com/D1861 Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaType.cpp cfe/trunk/test/CodeGen/microsoft-call-conv.c cfe/trunk/test/Sema/callingconv.c Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=192240&r1=192239&r2=192240&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Oct 8 16:52:56 2013 @@ -2053,6 +2053,9 @@ def err_cconv_knr : Error< "function with no prototype cannot use %0 calling convention">; def err_cconv_varargs : Error< "variadic function cannot use %0 calling convention">; +def warn_cconv_varargs : Warning< + "%0 calling convention ignored on variadic function">, + InGroup<IgnoredAttributes>; def err_regparm_mismatch : Error<"function declared with regparm(%0) " "attribute was previously declared " "%plural{0:without the regparm|:with the regparm(%1)}1 attribute">; Modified: cfe/trunk/lib/Sema/SemaType.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=192240&r1=192239&r2=192240&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaType.cpp (original) +++ cfe/trunk/lib/Sema/SemaType.cpp Tue Oct 8 16:52:56 2013 @@ -4553,7 +4553,11 @@ static bool handleFunctionTypeAttr(TypeP const FunctionProtoType *FnP = cast<FunctionProtoType>(fn); if (FnP->isVariadic()) { - S.Diag(attr.getLoc(), diag::err_cconv_varargs) + // In MS compatibility mode, this is just a warning. + const LangOptions &L = S.getLangOpts(); + unsigned DiagID = L.MicrosoftMode ? diag::warn_cconv_varargs + : diag::err_cconv_varargs; + S.Diag(attr.getLoc(), DiagID) << FunctionType::getNameForCallConv(CC); attr.setInvalid(); return true; Modified: cfe/trunk/test/CodeGen/microsoft-call-conv.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/microsoft-call-conv.c?rev=192240&r1=192239&r2=192240&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/microsoft-call-conv.c (original) +++ cfe/trunk/test/CodeGen/microsoft-call-conv.c Tue Oct 8 16:52:56 2013 @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple i386-pc-linux -emit-llvm < %s | FileCheck %s +// RUN: %clang_cc1 -triple i386-pc-linux -emit-llvm -fms-compatibility -DWIN < %s | FileCheck --check-prefix=WIN %s void __fastcall f1(void); void __stdcall f2(void); @@ -48,3 +49,11 @@ void f8(void) { f7(0); // CHECK: call x86_stdcallcc void @f7(i32 0) } + +// PR12535 +#ifdef WIN +void __fastcall f9(int x, int y) {}; +// WIN: define x86_fastcallcc void @f9({{.*}}) +void __fastcall f10(int x, ...) {}; +// WIN: define void @f10({{.*}}) +#endif Modified: cfe/trunk/test/Sema/callingconv.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/callingconv.c?rev=192240&r1=192239&r2=192240&view=diff ============================================================================== --- cfe/trunk/test/Sema/callingconv.c (original) +++ cfe/trunk/test/Sema/callingconv.c Tue Oct 8 16:52:56 2013 @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -fsyntax-only -triple i386-unknown-unknown -verify +// RUN: %clang_cc1 %s -fsyntax-only -triple i386-unknown-unknown -fms-compatibility -DWIN -verify void __attribute__((fastcall)) foo(float *a) { } @@ -15,8 +16,13 @@ void __attribute__((fastcall)) test0() { void __attribute__((fastcall)) test1(void) { } +#ifdef WIN +void __attribute__((fastcall)) test2(int a, ...) { // expected-warning {{fastcall calling convention ignored on variadic function}} +} +#else void __attribute__((fastcall)) test2(int a, ...) { // expected-error {{variadic function cannot use fastcall calling convention}} } +#endif void __attribute__((cdecl)) ctest0() {} _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
