diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -172,7 +172,6 @@ switch (Kind) { case tok::at: // May be a @try or @throw statement { - ProhibitAttributes(Attrs); // TODO: is it correct? AtLoc = ConsumeToken(); // consume @ return ParseObjCAtStatement(AtLoc, StmtCtx); } diff --git a/clang/test/CodeGenObjC/attr-nomerge.m b/clang/test/CodeGenObjC/attr-nomerge.m new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenObjC/attr-nomerge.m @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -emit-llvm -fobjc-exceptions -triple x86_64-unknown-linux -o - %s | FileCheck %s + +// Test that the nomerge attribute is applied to function calls +// in @try, @catch and @finally +void opaque(void); +void opaque2(void); +void opaque3(void); + +int main(int argc, const char * argv[]) { + __attribute__((nomerge)) @try { + opaque(); + } @catch(...) { + opaque2(); + } @finally { + opaque3(); + } + + return 0; +} + +// CHECK: call void @opaque() #[[ATTR0:[0-9]+]] +// CHECK-DAG: call void @opaque2() #[[ATTR0]] +// CHECK-DAG: call void @opaque3() #[[ATTR0]] +// CHECK-DAG: attributes #[[ATTR0]] = {{{.*}}nomerge{{.*}}}