[cfe-commits] r86001 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDeclAttr.cpp test/Sema/callingconv.c test/Sema/stdcall-fastcall.c

Daniel Dunbar daniel at zuster.org
Wed Nov 4 12:41:56 PST 2009


Hi John,

On Tue, Nov 3, 2009 at 7:36 PM, John McCall <rjmccall at apple.com> wrote:
> Author: rjmccall
> Date: Tue Nov  3 21:36:09 2009
> New Revision: 86001
>
> URL: http://llvm.org/viewvc/llvm-project?rev=86001&view=rev
> Log:
> Diagnose the use of 'fastcall' on functions without prototypes or with
> varargs prototypes.
>
>
> Modified:
>    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>    cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>    cfe/trunk/test/Sema/callingconv.c
>    cfe/trunk/test/Sema/stdcall-fastcall.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=86001&r1=86000&r2=86001&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Nov  3 21:36:09 2009
> @@ -619,6 +619,10 @@
>  def warn_gnu_inline_attribute_requires_inline : Warning<
>   "'gnu_inline' attribute requires function to be marked 'inline',"
>   " attribute ignored">;
> +def err_cconv_knr : Error<
> +  "function with no prototype cannot use '%0' calling convention">;

I'm not sure if we already have a canonical way of referring to this,
but IIRC we already use "K&R" in other places, which may be more
meaningful than "function with no prototype".

 - Daniel

> +def err_cconv_varargs : Error<
> +  "variadic function cannot use '%0' calling convention">;
>
>  def warn_attribute_ignored_for_field_of_type : Warning<
>   "%0 attribute ignored for field of type %1">;
>
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=86001&r1=86000&r2=86001&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Tue Nov  3 21:36:09 2009
> @@ -1032,6 +1032,22 @@
>   d->addAttr(::new (S.Context) StdCallAttr());
>  }
>
> +/// Diagnose the use of a non-standard calling convention on the given
> +/// function.
> +static void DiagnoseCConv(FunctionDecl *D, const char *CConv,
> +                          SourceLocation Loc, Sema &S) {
> +  if (!D->hasPrototype()) {
> +    S.Diag(Loc, diag::err_cconv_knr) << CConv;
> +    return;
> +  }
> +
> +  const FunctionProtoType *T = D->getType()->getAs<FunctionProtoType>();
> +  if (T->isVariadic()) {
> +    S.Diag(Loc, diag::err_cconv_varargs) << CConv;
> +    return;
> +  }
> +}
> +
>  static void HandleFastCallAttr(Decl *d, const AttributeList &Attr, Sema &S) {
>   // Attribute has no arguments.
>   if (Attr.getNumArgs() != 0) {
> @@ -1045,6 +1061,8 @@
>     return;
>   }
>
> +  DiagnoseCConv(cast<FunctionDecl>(d), "fastcall", Attr.getLoc(), S);
> +
>   // stdcall and fastcall attributes are mutually incompatible.
>   if (d->getAttr<StdCallAttr>()) {
>     S.Diag(Attr.getLoc(), diag::err_attributes_are_not_compatible)
>
> Modified: cfe/trunk/test/Sema/callingconv.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/callingconv.c?rev=86001&r1=86000&r2=86001&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Sema/callingconv.c (original)
> +++ cfe/trunk/test/Sema/callingconv.c Tue Nov  3 21:36:09 2009
> @@ -8,3 +8,12 @@
>
>  void __attribute__((fastcall(1))) baz(float *a) { // expected-error {{attribute requires 0 argument(s)}}
>  }
> +
> +void __attribute__((fastcall)) test0() { // expected-error {{function with no prototype cannot use 'fastcall' calling convention}}
> +}
> +
> +void __attribute__((fastcall)) test1(void) {
> +}
> +
> +void __attribute__((fastcall)) test2(int a, ...) { // expected-error {{variadic function cannot use 'fastcall' calling convention}}
> +}
>
> Modified: cfe/trunk/test/Sema/stdcall-fastcall.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/stdcall-fastcall.c?rev=86001&r1=86000&r2=86001&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Sema/stdcall-fastcall.c (original)
> +++ cfe/trunk/test/Sema/stdcall-fastcall.c Tue Nov  3 21:36:09 2009
> @@ -5,6 +5,6 @@
>  int __attribute__((fastcall)) var2; // expected-warning{{'fastcall' attribute only applies to function types}}
>
>  // Different CC qualifiers are not compatible
> -void __attribute__((stdcall, fastcall)) foo3(); // expected-error{{stdcall and fastcall attributes are not compatible}}
> +void __attribute__((stdcall, fastcall)) foo3(void); // expected-error{{stdcall and fastcall attributes are not compatible}}
>  void __attribute__((stdcall)) foo4();
> -void __attribute__((fastcall)) foo4(); // expected-error{{fastcall and stdcall attributes are not compatible}}
> +void __attribute__((fastcall)) foo4(void); // expected-error{{fastcall and stdcall attributes are not compatible}}
>
>
> _______________________________________________
> 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