[clang] bc6b139 - [clang][parser] Don't prohibit attributes on objc @try/@throw
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 23 07:27:12 PDT 2021
Author: Timm Bäder
Date: 2021-03-23T15:26:25+01:00
New Revision: bc6b139392f638a69e85a474eb0eb59e13d9791a
URL: https://github.com/llvm/llvm-project/commit/bc6b139392f638a69e85a474eb0eb59e13d9791a
DIFF: https://github.com/llvm/llvm-project/commit/bc6b139392f638a69e85a474eb0eb59e13d9791a.diff
LOG: [clang][parser] Don't prohibit attributes on objc @try/@throw
This line has a TODO comment, but the answer to it seems to be "no"
given that clang itself uses attributes on @try statements in its tests.
This ProhibitAttributes() statement is also dead code since
ProhibitAttributs() does not handle GNU attributes at the moment but
those are the only attributes valid in objc.
Differential Revision: https://reviews.llvm.org/D97371
Added:
clang/test/CodeGenObjC/attr-nomerge.m
Modified:
clang/lib/Parse/ParseStmt.cpp
Removed:
################################################################################
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index 798b8d0d7eb1..bcda3560ce63 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -172,7 +172,6 @@ StmtResult Parser::ParseStatementOrDeclarationAfterAttributes(
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
index 000000000000..7d053d0b1d69
--- /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{{.*}}}
More information about the cfe-commits
mailing list