r173746 - Replace AS_MSTypespec with AS_Keyword, for representing any attribute spelled
Timur Iskhodzhanov
timurrrr at google.com
Mon Jan 28 23:31:03 PST 2013
Hi Richard,
I believe your change has broken compilation of <windows.h> on Windows:
--------------
In file included from windows_h_test.cpp:1:
In file included from c:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\include\windows.h:155:
In file included from c:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\include\windef.h:177:
In file included from c:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\include\winnt.h:159:
c:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\include\basetsd.h:361:20: error: '__ptr64'
attribute ignored when parsing type
return((void * POINTER_64) (unsigned __int64) (ULONG_PTR)p );
^~~~~~~~~~
c:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\include\basetsd.h:36:23: note: expanded from macro
'POINTER_64'
#define POINTER_64 __ptr64
^~~~~~~
c:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\include\basetsd.h:379:20: error: '__ptr64'
attribute ignored when parsing type
return((void * POINTER_64)(__int64)(LONG_PTR)h );
^~~~~~~~~~
c:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\include\basetsd.h:36:23: note: expanded from macro
'POINTER_64'
#define POINTER_64 __ptr64
--------------
Can you please check?
Thanks
--
Timur
2013/1/29 Richard Smith <richard-llvm at metafoo.co.uk>:
> Author: rsmith
> Date: Mon Jan 28 19:24:26 2013
> New Revision: 173746
>
> URL: http://llvm.org/viewvc/llvm-project?rev=173746&view=rev
> Log:
> Replace AS_MSTypespec with AS_Keyword, for representing any attribute spelled
> as a keyword. Rationalize existing attributes to use it as appropriate, and to
> not lie about some __declspec attributes being GNU attributes. In passing,
> remove a gross hack which was discarding attributes which we could handle. This
> results in us actually respecting the __pascal keyword again.
>
> Modified:
> cfe/trunk/include/clang/Basic/Attr.td
> cfe/trunk/include/clang/Sema/AttributeList.h
> cfe/trunk/lib/Parse/ParseDecl.cpp
> cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> cfe/trunk/lib/Sema/SemaType.cpp
> cfe/trunk/test/Sema/attr-print.c
> cfe/trunk/test/SemaCXX/attr-print.cpp
> cfe/trunk/test/SemaCXX/borland-extensions.cpp
> cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp
> cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
>
> Modified: cfe/trunk/include/clang/Basic/Attr.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/Attr.td (original)
> +++ cfe/trunk/include/clang/Basic/Attr.td Mon Jan 28 19:24:26 2013
> @@ -29,8 +29,8 @@ class SubsetSubject<AttrSubject base, st
> code CheckCode = check;
> }
>
> -// This is the type of a variable which C++11 defines [[aligned()]] as being
> -// a possible subject.
> +// This is the type of a variable which C++11 allows alignas(...) to appertain
> +// to.
> def NormalVar : SubsetSubject<Var, "non-register, non-parameter variable",
> [{S->getStorageClass() != VarDecl::Register &&
> S->getKind() != Decl::ImplicitParam &&
> @@ -91,6 +91,7 @@ class Declspec<string name> : Spelling<n
> class CXX11<string namespace, string name> : Spelling<name, "CXX11"> {
> string Namespace = namespace;
> }
> +class Keyword<string name> : Spelling<name, "Keyword">;
>
> class Attr {
> // The various ways in which an attribute can be spelled in source
> @@ -125,6 +126,13 @@ class InheritableAttr : Attr;
> /// redeclarations, even when it's written on a parameter.
> class InheritableParamAttr : InheritableAttr;
>
> +/// An ignored attribute, which we parse but discard with no checking.
> +class IgnoredAttr : Attr {
> + let Ignored = 1;
> + let ASTNode = 0;
> + let SemaHandler = 0;
> +}
> +
> //
> // Attributes begin here
> //
> @@ -141,7 +149,8 @@ def Alias : InheritableAttr {
> }
>
> def Aligned : InheritableAttr {
> - let Spellings = [GNU<"aligned">, GNU<"align">, CXX11<"gnu", "aligned">];
> + let Spellings = [GNU<"aligned">, Declspec<"align">, CXX11<"gnu", "aligned">,
> + Keyword<"alignas">];
> let Subjects = [NonBitField, NormalVar, Tag];
> let Args = [AlignedArgument<"Alignment">, BoolArgument<"IsMSDeclSpec">];
> }
> @@ -200,11 +209,8 @@ def Blocks : InheritableAttr {
> let Args = [EnumArgument<"Type", "BlockType", ["byref"], ["ByRef"]>];
> }
>
> -def Bounded : Attr {
> +def Bounded : IgnoredAttr {
> let Spellings = [GNU<"bounded">];
> - let ASTNode = 0;
> - let SemaHandler = 0;
> - let Ignored = 1;
> }
>
> def CarriesDependency : InheritableParamAttr {
> @@ -214,7 +220,7 @@ def CarriesDependency : InheritableParam
> }
>
> def CDecl : InheritableAttr {
> - let Spellings = [GNU<"cdecl">, GNU<"__cdecl">, CXX11<"gnu", "cdecl">];
> + let Spellings = [GNU<"cdecl">, CXX11<"gnu", "cdecl">, Keyword<"__cdecl">];
> }
>
> // cf_audited_transfer indicates that the given function has been
> @@ -302,7 +308,7 @@ def CXX11NoReturn : InheritableAttr {
> }
>
> def OpenCLKernel : Attr {
> - let Spellings = [GNU<"opencl_kernel_function">];
> + let Spellings = [Keyword<"__kernel">, Keyword<"kernel">];
> }
>
> def OpenCLImageAccess : Attr {
> @@ -333,8 +339,8 @@ def FallThrough : Attr {
> }
>
> def FastCall : InheritableAttr {
> - let Spellings = [GNU<"fastcall">, GNU<"__fastcall">,
> - CXX11<"gnu", "fastcall">];
> + let Spellings = [GNU<"fastcall">, CXX11<"gnu", "fastcall">,
> + Keyword<"__fastcall">];
> }
>
> def Final : InheritableAttr {
> @@ -631,16 +637,17 @@ def Sentinel : InheritableAttr {
> }
>
> def StdCall : InheritableAttr {
> - let Spellings = [GNU<"stdcall">, GNU<"__stdcall">, CXX11<"gnu", "stdcall">];
> + let Spellings = [GNU<"stdcall">, CXX11<"gnu", "stdcall">,
> + Keyword<"__stdcall">];
> }
>
> def ThisCall : InheritableAttr {
> - let Spellings = [GNU<"thiscall">, GNU<"__thiscall">,
> - CXX11<"gnu", "thiscall">];
> + let Spellings = [GNU<"thiscall">, CXX11<"gnu", "thiscall">,
> + Keyword<"__thiscall">];
> }
>
> def Pascal : InheritableAttr {
> - let Spellings = [GNU<"pascal">];
> + let Spellings = [GNU<"pascal">, Keyword<"__pascal">];
> }
>
> def TransparentUnion : InheritableAttr {
> @@ -694,11 +701,8 @@ def VectorSize : Attr {
> let ASTNode = 0;
> }
>
> -def VecTypeHint : Attr {
> +def VecTypeHint : IgnoredAttr {
> let Spellings = [GNU<"vec_type_hint">];
> - let ASTNode = 0;
> - let SemaHandler = 0;
> - let Ignored = 1;
> }
>
> def Visibility : InheritableAttr {
> @@ -894,29 +898,33 @@ def DLLImport : InheritableAttr {
> }
>
> def ForceInline : InheritableAttr {
> - let Spellings = [Declspec<"__forceinline">];
> + let Spellings = [Keyword<"__forceinline">];
> }
>
> def Win64 : InheritableAttr {
> - let Spellings = [Declspec<"w64">];
> + let Spellings = [Keyword<"__w64">];
> }
>
> def Ptr32 : InheritableAttr {
> - let Spellings = [Declspec<"__ptr32">];
> + let Spellings = [Keyword<"__ptr32">];
> }
>
> def Ptr64 : InheritableAttr {
> - let Spellings = [Declspec<"__ptr64">];
> + let Spellings = [Keyword<"__ptr64">];
> }
>
> def SingleInheritance : InheritableAttr {
> - let Spellings = [Declspec<"__single_inheritance">];
> + let Spellings = [Keyword<"__single_inheritance">];
> }
>
> def MultipleInheritance : InheritableAttr {
> - let Spellings = [Declspec<"__multiple_inheritance">];
> + let Spellings = [Keyword<"__multiple_inheritance">];
> }
>
> def VirtualInheritance : InheritableAttr {
> - let Spellings = [Declspec<"__virtual_inheritance">];
> + let Spellings = [Keyword<"__virtual_inheritance">];
> +}
> +
> +def Unaligned : IgnoredAttr {
> + let Spellings = [Keyword<"__unaligned">];
> }
>
> Modified: cfe/trunk/include/clang/Sema/AttributeList.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/AttributeList.h?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/AttributeList.h (original)
> +++ cfe/trunk/include/clang/Sema/AttributeList.h Mon Jan 28 19:24:26 2013
> @@ -56,12 +56,14 @@ class AttributeList { // TODO: This shou
> public:
> /// The style used to specify an attribute.
> enum Syntax {
> + /// __attribute__((...))
> AS_GNU,
> + /// [[...]]
> AS_CXX11,
> + /// __declspec(...)
> AS_Declspec,
> - // eg) __w64, __ptr32, etc. It is implied that an MSTypespec is also
> - // a declspec.
> - AS_MSTypespec
> + /// __ptr16, alignas(...), etc.
> + AS_Keyword
> };
> private:
> IdentifierInfo *AttrName;
> @@ -227,12 +229,9 @@ public:
> IdentifierInfo *getParameterName() const { return ParmName; }
> SourceLocation getParameterLoc() const { return ParmLoc; }
>
> - /// Returns true if the attribute is a pure __declspec or a synthesized
> - /// declspec representing a type specification (like __w64 or __ptr32).
> - bool isDeclspecAttribute() const { return SyntaxUsed == AS_Declspec ||
> - SyntaxUsed == AS_MSTypespec; }
> + bool isDeclspecAttribute() const { return SyntaxUsed == AS_Declspec; }
> bool isCXX11Attribute() const { return SyntaxUsed == AS_CXX11; }
> - bool isMSTypespecAttribute() const { return SyntaxUsed == AS_MSTypespec; }
> + bool isKeywordAttribute() const { return SyntaxUsed == AS_Keyword; }
>
> bool isInvalid() const { return Invalid; }
> void setInvalid(bool b = true) const { Invalid = b; }
>
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Mon Jan 28 19:24:26 2013
> @@ -462,7 +462,7 @@ void Parser::ParseMicrosoftTypeAttribute
> IdentifierInfo *AttrName = Tok.getIdentifierInfo();
> SourceLocation AttrNameLoc = ConsumeToken();
> attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
> - SourceLocation(), 0, 0, AttributeList::AS_MSTypespec);
> + SourceLocation(), 0, 0, AttributeList::AS_Keyword);
> }
> }
>
> @@ -472,21 +472,23 @@ void Parser::ParseBorlandTypeAttributes(
> IdentifierInfo *AttrName = Tok.getIdentifierInfo();
> SourceLocation AttrNameLoc = ConsumeToken();
> attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
> - SourceLocation(), 0, 0, AttributeList::AS_MSTypespec);
> + SourceLocation(), 0, 0, AttributeList::AS_Keyword);
> }
> }
>
> void Parser::ParseOpenCLAttributes(ParsedAttributes &attrs) {
> // Treat these like attributes
> while (Tok.is(tok::kw___kernel)) {
> + IdentifierInfo *AttrName = Tok.getIdentifierInfo();
> SourceLocation AttrNameLoc = ConsumeToken();
> - attrs.addNew(PP.getIdentifierInfo("opencl_kernel_function"),
> - AttrNameLoc, 0, AttrNameLoc, 0,
> - SourceLocation(), 0, 0, AttributeList::AS_GNU);
> + attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0,
> + SourceLocation(), 0, 0, AttributeList::AS_Keyword);
> }
> }
>
> void Parser::ParseOpenCLQualifiers(DeclSpec &DS) {
> + // FIXME: The mapping from attribute spelling to semantics should be
> + // performed in Sema, not here.
> SourceLocation Loc = Tok.getLocation();
> switch(Tok.getKind()) {
> // OpenCL qualifiers:
>
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Mon Jan 28 19:24:26 2013
> @@ -4759,11 +4759,11 @@ static void ProcessDeclAttribute(Sema &S
> if (Attr.isInvalid())
> return;
>
> - // Type attributes are still treated as declaration attributes by
> - // ParseMicrosoftTypeAttributes and ParseBorlandTypeAttributes. We don't
> - // want to process them, however, because we will simply warn about ignoring
> - // them. So instead, we will bail out early.
> - if (Attr.isMSTypespecAttribute())
> + // FIXME: Ignore unknown keyword attributes for now. We see this in the case
> + // of some Borland attributes, like __pascal.
> + // FIXME: Add these attributes to Attr.td and mark as ignored!
> + if (Attr.isKeywordAttribute() &&
> + Attr.getKind() == AttributeList::UnknownAttribute)
> return;
>
> // Ignore C++11 attributes on declarator chunks: they appertain to the type
>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Mon Jan 28 19:24:26 2013
> @@ -4336,13 +4336,6 @@ static void processTypeAttrs(TypeProcess
> attr.setUsedAsTypeAttr();
> break;
>
> - case AttributeList::AT_Win64:
> - case AttributeList::AT_Ptr32:
> - case AttributeList::AT_Ptr64:
> - // FIXME: don't ignore these
> - attr.setUsedAsTypeAttr();
> - break;
> -
> case AttributeList::AT_NSReturnsRetained:
> if (!state.getSema().getLangOpts().ObjCAutoRefCount)
> break;
>
> Modified: cfe/trunk/test/Sema/attr-print.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-print.c?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/attr-print.c (original)
> +++ cfe/trunk/test/Sema/attr-print.c Mon Jan 28 19:24:26 2013
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 %s -ast-print | FileCheck %s
> +// RUN: %clang_cc1 %s -ast-print -fms-extensions | FileCheck %s
>
> // FIXME: we need to fix the "BoolArgument<"IsMSDeclSpec">"
> // hack in Attr.td for attribute "Aligned".
> @@ -6,8 +6,9 @@
> // CHECK: int x __attribute__((aligned(4, 0)));
> int x __attribute__((aligned(4)));
>
> -// CHECK: int y __attribute__((align(4, 0)));
> -int y __attribute__((align(4)));
> +// FIXME: Print this at a valid location for a __declspec attr.
> +// CHECK: int y __declspec(align(4, 1));
> +__declspec(align(4)) int y;
>
> // CHECK: void foo() __attribute__((const));
> void foo() __attribute__((const));
>
> Modified: cfe/trunk/test/SemaCXX/attr-print.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-print.cpp?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/attr-print.cpp (original)
> +++ cfe/trunk/test/SemaCXX/attr-print.cpp Mon Jan 28 19:24:26 2013
> @@ -1,12 +1,13 @@
> -// RUN: %clang_cc1 %s -ast-print | FileCheck %s
> +// RUN: %clang_cc1 %s -ast-print -fms-extensions | FileCheck %s
>
> // FIXME: align attribute print
>
> // CHECK: int x __attribute__((aligned(4, 0)));
> int x __attribute__((aligned(4)));
>
> -// CHECK: int y __attribute__((align(4, 0)));
> -int y __attribute__((align(4)));
> +// FIXME: Print this at a valid location for a __declspec attr.
> +// CHECK: int y __declspec(align(4, 1));
> +__declspec(align(4)) int y;
>
> // CHECK: void foo() __attribute__((const));
> void foo() __attribute__((const));
>
> Modified: cfe/trunk/test/SemaCXX/borland-extensions.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/borland-extensions.cpp?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/borland-extensions.cpp (original)
> +++ cfe/trunk/test/SemaCXX/borland-extensions.cpp Mon Jan 28 19:24:26 2013
> @@ -1,5 +1,5 @@
> -// RUN: %clang_cc1 %s -fsyntax-only -verify -fborland-extensions
> -// expected-no-diagnostics
> +// RUN: %clang_cc1 %s -fsyntax-only -fborland-extensions -triple x86_64-linux-gnu -verify
> +// RUN: %clang_cc1 %s -fsyntax-only -fborland-extensions -triple i686-linux-gnu -Werror
>
> // Borland extensions
>
> @@ -9,13 +9,18 @@ int dummy_function() { return 0; }
> // 2. test __pascal
> int _pascal f2();
>
> +// expected-warning at +1 {{calling convention '__pascal' ignored for this target}}
> float __pascal gi2(int, int);
> +// expected-warning at +1 {{calling convention '__pascal' ignored for this target}}
> template<typename T> T g2(T (__pascal * const )(int, int)) { return 0; }
>
> struct M {
> + // expected-warning at +1 {{calling convention '__pascal' ignored for this target}}
> int __pascal addP();
> + // expected-warning at +1 {{calling convention '__pascal' ignored for this target}}
> float __pascal subtractP();
> };
> +// expected-warning at +1 {{calling convention '__pascal' ignored for this target}}
> template<typename T> int h2(T (__pascal M::* const )()) { return 0; }
> void m2() {
> int i; float f;
>
> Modified: cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp (original)
> +++ cfe/trunk/test/SemaCXX/cxx11-attr-print.cpp Mon Jan 28 19:24:26 2013
> @@ -1,11 +1,12 @@
> -// RUN: %clang_cc1 -std=c++11 -ast-print %s | FileCheck %s
> +// RUN: %clang_cc1 -std=c++11 -ast-print -fms-extensions %s | FileCheck %s
> // FIXME: align attribute print
>
> // CHECK: int x __attribute__((aligned(4, 0)));
> int x __attribute__((aligned(4)));
>
> -// CHECK: int y __attribute__((align(4, 0)));
> -int y __attribute__((align(4)));
> +// FIXME: Print this at a valid location for a __declspec attr.
> +// CHECK: int y __declspec(align(4, 1));
> +__declspec(align(4)) int y;
>
> // CHECK: gnu::aligned(4, 0)]];
> int z [[gnu::aligned(4)]];
>
> Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=173746&r1=173745&r2=173746&view=diff
> ==============================================================================
> --- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)
> +++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Mon Jan 28 19:24:26 2013
> @@ -776,8 +776,11 @@ static void writePrettyPrintFunction(Rec
> } else if (Variety == "Declspec") {
> Prefix = " __declspec(";
> Suffix = ")";
> + } else if (Variety == "Keyword") {
> + Prefix = " ";
> + Suffix = "";
> } else {
> - llvm_unreachable("Unkown attribute syntax variety!");
> + llvm_unreachable("Unknown attribute syntax variety!");
> }
>
> Spelling += Name;
> @@ -1149,6 +1152,7 @@ void EmitClangAttrSpellingListIndex(Reco
> .Case("GNU", 0)
> .Case("CXX11", 1)
> .Case("Declspec", 2)
> + .Case("Keyword", 3)
> .Default(0)
> << " && Scope == \"" << Namespace << "\")\n"
> << " return " << I << ";\n";
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
--
Timur Iskhodzhanov,
Google Russia
More information about the cfe-commits
mailing list