[PATCH] D11142: Support alternate attribute spelling __enable_if__
Aaron Ballman
aaron.ballman at gmail.com
Mon Jul 13 07:01:51 PDT 2015
On Mon, Jul 13, 2015 at 9:42 AM, Ulrich Weigand
<ulrich.weigand at 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
More information about the cfe-commits
mailing list