Turned on support for __declspecs: noreturn, noinline, nothrow and naked in MS compatibility mode.

llvm-svn: 151295
This commit is contained in:
Aaron Ballman 2012-02-23 22:46:33 +00:00
parent 052a62c7fe
commit 0c84ebb539
3 changed files with 33 additions and 4 deletions

View File

@ -3463,10 +3463,19 @@ static void handleObjCPreciseLifetimeAttr(Sema &S, Decl *D,
}
static bool isKnownDeclSpecAttr(const AttributeList &Attr) {
return Attr.getKind() == AttributeList::AT_dllimport ||
Attr.getKind() == AttributeList::AT_dllexport ||
Attr.getKind() == AttributeList::AT_uuid ||
Attr.getKind() == AttributeList::AT_deprecated;
switch (Attr.getKind()) {
default:
return false;
case AttributeList::AT_dllimport:
case AttributeList::AT_dllexport:
case AttributeList::AT_uuid:
case AttributeList::AT_deprecated:
case AttributeList::AT_noreturn:
case AttributeList::AT_nothrow:
case AttributeList::AT_naked:
case AttributeList::AT_noinline:
return true;
}
}
//===----------------------------------------------------------------------===//

View File

@ -0,0 +1,16 @@
// RUN: %clang_cc1 -triple i386-pc-win32 %s -emit-llvm -fms-compatibility -o - | FileCheck %s
// CHECK: define void @t3() nounwind noinline naked {
__declspec(naked) void t3() {}
// CHECK: define void @t22() nounwind
void __declspec(nothrow) t22();
void t22() {}
// CHECK: define void @t2() nounwind noinline {
__declspec(noinline) void t2() {}
// CHECK: call void @f20_t()
// CHECK: noreturn
__declspec(noreturn) void f20_t(void);
void f20(void) { f20_t(); }

View File

@ -10,3 +10,7 @@ enum ENUM2 {
ENUM2_b = 0x9FFFFFFF, // expected-warning {{enumerator value is not representable in the underlying type 'int'}}
ENUM2_c = 0x100000000 // expected-warning {{enumerator value is not representable in the underlying type 'int'}}
};
__declspec(noreturn) void f6( void ) {
return; // expected-warning {{function 'f6' declared 'noreturn' should not return}}
}