[PATCH] Turn error about fastcall variadic function into warning in MS mode (PR12535)

Aaron Ballman aaron at aaronballman.com
Tue Oct 8 14:28:56 PDT 2013


Patch LGTM

~Aaron

On Tue, Oct 8, 2013 at 5:22 PM, Hans Wennborg <hans at chromium.org> wrote:
> Hi rnk,
>
> Previously we'd throw an error for declaring a variadic function with __fastcall calling convention.
>
> It seems msvc accepts this though, and silently falls back to __cdecl.
>
> For compatibility with msvc, this patch turns the error into a warning in MS mode and makes sure (we did this already, but I added a test) that we fall back to __cdecl.
>
>
> I did note that Clang doesn't warn or error about declaring a variadic function with __stdcall or __thiscall. I'll look into that in a separate patch.
>
> http://llvm-reviews.chandlerc.com/D1861
>
> Files:
>   include/clang/Basic/DiagnosticSemaKinds.td
>   lib/Sema/SemaType.cpp
>   test/CodeGen/microsoft-call-conv.c
>   test/Sema/callingconv.c
>
> Index: include/clang/Basic/DiagnosticSemaKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticSemaKinds.td
> +++ include/clang/Basic/DiagnosticSemaKinds.td
> @@ -2053,6 +2053,9 @@
>    "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">;
> Index: lib/Sema/SemaType.cpp
> ===================================================================
> --- lib/Sema/SemaType.cpp
> +++ lib/Sema/SemaType.cpp
> @@ -4553,7 +4553,11 @@
>
>      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;
> Index: test/CodeGen/microsoft-call-conv.c
> ===================================================================
> --- test/CodeGen/microsoft-call-conv.c
> +++ test/CodeGen/microsoft-call-conv.c
> @@ -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 @@
>    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
> Index: test/Sema/callingconv.c
> ===================================================================
> --- test/Sema/callingconv.c
> +++ test/Sema/callingconv.c
> @@ -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)) 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



More information about the cfe-commits mailing list