[PATCH] Only strip underscores for GNU attributes
Alp Toker
alp at nuanti.com
Wed Dec 11 13:13:36 PST 2013
On 05/12/2013 20:16, Aaron Ballman wrote:
> Currently, attribute names that have surrounding double underscores
> will have them stripped silently when determining the attribute kind.
> However, this doesn't make sense for all forms of attributes. For
> instance: __declspec(__dllexport__) should not be a valid attribute
> name, nor should [[__carries_dependency__]]
>
> This patch checks the attribute form and only strips the underscores
> for GNU attributes. However, it does also handle C++11-style GNU
> attribute as well, because there are existing test cases checking for
> that. Do we want to have the same behavior for C++11-style clang
> attributes?
>
> ~Aaron
Hi Aaron,
Seems fine to do as you did and limit this to spellings of GNU
attributes only as doing it for C++11 attributes was clearly wrong. We
can then consider limiting it further for C++11 GNU spellings if there's
a need (but my understanding is that there isn't.)
Small style nits below, LG otherwise..
> Index: lib/Sema/AttributeList.cpp
> ===================================================================
> --- lib/Sema/AttributeList.cpp (revision 196524)
> +++ lib/Sema/AttributeList.cpp (working copy)
> @@ -121,14 +121,17 @@
> Syntax SyntaxUsed) {
> StringRef AttrName = Name->getName();
>
> - // Normalize the attribute name, __foo__ becomes foo.
> - if (AttrName.size() >= 4 && AttrName.startswith("__") &&
> + SmallString<64> Buf;
Call this something like FullName, or anything more descriptive than Buf :-)
> + if (ScopeName)
> + Buf += ScopeName->getName();
> +
> + // Normalize the attribute name, __foo__ becomes foo. This is only
> allowable
> + // for GNU attributes.
> + if ((SyntaxUsed == AS_GNU || (SyntaxUsed == AS_CXX11 &&
> Buf.equals("gnu"))) &&
Breaking the checks into an IsGNU bool would improve readability.
> + AttrName.size() >= 4 && AttrName.startswith("__") &&
> AttrName.endswith("__"))
> AttrName = AttrName.substr(2, AttrName.size() - 4);
AttrName.slice(2, AttrName.size() - 2) more readable? Your call.
Alp.
>
> - SmallString<64> Buf;
> - if (ScopeName)
> - Buf += ScopeName->getName();
> // Ensure that in the case of C++11 attributes, we look for '::foo'
> if it is
> // unscoped.
> if (ScopeName || SyntaxUsed == AS_CXX11)
> Index: test/Sema/MicrosoftCompatibility.c
> ===================================================================
> --- test/Sema/MicrosoftCompatibility.c (revision 196524)
> +++ test/Sema/MicrosoftCompatibility.c (working copy)
> @@ -19,3 +19,5 @@
> struct __declspec(aligned) S2 {}; /* expected-warning {{unknown
> __declspec attribute 'aligned' ignored}} */
>
> struct __declspec(appdomain) S3 {}; /* expected-warning {{__declspec
> attribute 'appdomain' is not supported}} */
> +
> +__declspec(__noreturn__) void f7(void); /* expected-warning {{unknown
> __declspec attribute '__noreturn__' ignored}} */
> Index: test/SemaCXX/attr-cxx0x.cpp
> ===================================================================
> --- test/SemaCXX/attr-cxx0x.cpp (revision 196524)
> +++ test/SemaCXX/attr-cxx0x.cpp (working copy)
> @@ -45,3 +45,6 @@
> static_assert(alignof(outer<int,char>::inner<double,short>) ==
> alignof(int) * alignof(double), "template's alignment is wrong");
>
> static_assert(alignof(int(int)) >= 1, "alignof(function) not
> positive"); // expected-error{{invalid application of 'alignof' to a
> function type}}
> +
> +[[__carries_dependency__]] // expected-warning{{unknown attribute
> '__carries_dependency__' ignored}}
> +void func(void);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
--
http://www.nuanti.com
the browser experts
More information about the cfe-commits
mailing list