Hi John, On Tue, Nov 3, 2009 at 7:36 PM, John McCall <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
