Index: clang/lib/Parse/ParseStmt.cpp =================================================================== --- clang/lib/Parse/ParseStmt.cpp +++ 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); } Index: clang/test/CodeGenObjC/attr-nomerge.m =================================================================== --- /dev/null +++ clang/test/CodeGenObjC/attr-nomerge.m @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -emit-llvm -fobjc-exceptions -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); + +@class C; + +int main(int argc, const char * argv[]) { + __attribute__((nomerge)) @try { + opaque(); + } @catch(C *c) { + 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{{.*}}}