aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-01-29 01:38:41 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-01-29 01:38:41 +0000
commitcda7968b38d76848b4fb24f7cc28ab83835b4ea3 (patch)
tree744f269ce4546de2c9db60d9439a0428a1b79c6b
parentf727e1c6cc382c1b5fe23b38ba04df2d4a2f358a (diff)
Actually remove the hack which was blocking the Borland-style attributes from
working, and add the missing attribute spellings. This brings _pascal, _fastcall, _stdcall and _cdecl to life in -fborland-extensions mode. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173749 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/Attr.td11
-rw-r--r--lib/Sema/SemaDeclAttr.cpp7
-rw-r--r--test/SemaCXX/borland-extensions.cpp3
3 files changed, 9 insertions, 12 deletions
diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td
index 8a3e788bfe..a65ffa4319 100644
--- a/include/clang/Basic/Attr.td
+++ b/include/clang/Basic/Attr.td
@@ -220,7 +220,8 @@ def CarriesDependency : InheritableParamAttr {
}
def CDecl : InheritableAttr {
- let Spellings = [GNU<"cdecl">, CXX11<"gnu", "cdecl">, Keyword<"__cdecl">];
+ let Spellings = [GNU<"cdecl">, CXX11<"gnu", "cdecl">, Keyword<"__cdecl">,
+ Keyword<"_cdecl">];
}
// cf_audited_transfer indicates that the given function has been
@@ -340,7 +341,7 @@ def FallThrough : Attr {
def FastCall : InheritableAttr {
let Spellings = [GNU<"fastcall">, CXX11<"gnu", "fastcall">,
- Keyword<"__fastcall">];
+ Keyword<"__fastcall">, Keyword<"_fastcall">];
}
def Final : InheritableAttr {
@@ -638,16 +639,16 @@ def Sentinel : InheritableAttr {
def StdCall : InheritableAttr {
let Spellings = [GNU<"stdcall">, CXX11<"gnu", "stdcall">,
- Keyword<"__stdcall">];
+ Keyword<"__stdcall">, Keyword<"_stdcall">];
}
def ThisCall : InheritableAttr {
let Spellings = [GNU<"thiscall">, CXX11<"gnu", "thiscall">,
- Keyword<"__thiscall">];
+ Keyword<"__thiscall">, Keyword<"_thiscall">];
}
def Pascal : InheritableAttr {
- let Spellings = [GNU<"pascal">, Keyword<"__pascal">];
+ let Spellings = [GNU<"pascal">, Keyword<"__pascal">, Keyword<"_pascal">];
}
def TransparentUnion : InheritableAttr {
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp
index 12483a34e0..a4b8c356dd 100644
--- a/lib/Sema/SemaDeclAttr.cpp
+++ b/lib/Sema/SemaDeclAttr.cpp
@@ -4759,13 +4759,6 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
if (Attr.isInvalid())
return;
- // 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
// instead.
if (Attr.isCXX11Attribute() && !IncludeCXX11Attributes)
diff --git a/test/SemaCXX/borland-extensions.cpp b/test/SemaCXX/borland-extensions.cpp
index f9414f8869..d214473031 100644
--- a/test/SemaCXX/borland-extensions.cpp
+++ b/test/SemaCXX/borland-extensions.cpp
@@ -7,6 +7,7 @@
int dummy_function() { return 0; }
// 2. test __pascal
+// expected-warning@+1 {{calling convention '_pascal' ignored for this target}}
int _pascal f2();
// expected-warning@+1 {{calling convention '__pascal' ignored for this target}}
@@ -33,7 +34,9 @@ void m2() {
// 3. test other calling conventions
int _cdecl fa3();
+// expected-warning@+1 {{calling convention '_fastcall' ignored for this target}}
int _fastcall fc3();
+// expected-warning@+1 {{calling convention '_stdcall' ignored for this target}}
int _stdcall fd3();
// 4. test __uuidof()