On Mon, Jul 13, 2015 at 9:42 AM, Ulrich Weigand <ulrich.weig...@de.ibm.com> wrote: > uweigand created this revision. > uweigand added reviewers: aaron.ballman, rsmith. > uweigand added a subscriber: cfe-commits. > > Attribute names usually support an alternate spelling that uses double > underscores before and after the attribute name, like e.g. attribute > ((__aligned__)) for attribute ((aligned)). This is necessary to allow use of > attributes in system headers without polluting the name space. > > However, for attribute ((enable_if)) that alternate spelling does not work > correctly. This is because of code in Parser::ParseGNUAttributeArgs > (ParseDecl.cpp) that specifically checks for the "enable_if" spelling without > allowing the alternate spelling. > > Similar code in ParseDecl.cpp uses the normalizeAttrName helper to allow both > spellings. This patch adds use of that helper for the "enable_if" check as > well, which fixes attribute ((__enable_if__)). > > > http://reviews.llvm.org/D11142 > > Files: > lib/Parse/ParseDecl.cpp > test/Sema/enable_if.c > > Index: test/Sema/enable_if.c > =================================================================== > --- test/Sema/enable_if.c > +++ test/Sema/enable_if.c > @@ -77,6 +77,21 @@ > #endif > } > > +// Verify that the alternate spelling __enable_if__ works as well. > +int isdigit2(int c) __attribute__((overloadable)); // > expected-note{{candidate function}} > +int isdigit2(int c) __attribute__((overloadable)) // > expected-note{{candidate function has been explicitly made unavailable}} > + __attribute__((__enable_if__(c <= -1 || c > 255, "'c' must have the value > of an unsigned char or EOF"))) > + __attribute__((unavailable("'c' must have the value of an unsigned char or > EOF"))); > + > +void test4(int c) { > + isdigit2(c); > + isdigit2(10); > +#ifndef CODEGEN > + isdigit2(-10); // expected-error{{call to unavailable function > 'isdigit2': 'c' must have the value of an unsigned char or EOF}} > +#endif > +} > + > + > #ifndef CODEGEN > __attribute__((enable_if(n == 0, "chosen when 'n' is zero"))) void f1(int > n); // expected-error{{use of undeclared identifier 'n'}} > > Index: lib/Parse/ParseDecl.cpp > =================================================================== > --- lib/Parse/ParseDecl.cpp > +++ lib/Parse/ParseDecl.cpp > @@ -365,7 +365,8 @@ > // These may refer to the function arguments, but need to be parsed early > to > // participate in determining whether it's a redeclaration. > std::unique_ptr<ParseScope> PrototypeScope; > - if (AttrName->isStr("enable_if") && D && D->isFunctionDeclarator()) { > + if (normalizeAttrName(AttrName->getName()) == "enable_if" && > + D && D->isFunctionDeclarator()) { > DeclaratorChunk::FunctionTypeInfo FTI = D->getFunctionTypeInfo(); > PrototypeScope.reset(new ParseScope(this, Scope::FunctionPrototypeScope | > Scope::FunctionDeclarationScope |
LGTM! ~Aaron _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits