[clang] 81bc136 - Correct swift_bridge duplicate attribute warning logic
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 11 04:12:46 PST 2021
Author: Aaron Ballman
Date: 2021-02-11T07:11:27-05:00
New Revision: 81bc1365d8f85a125a6db6a5a1acff3ceddcbe9e
URL: https://github.com/llvm/llvm-project/commit/81bc1365d8f85a125a6db6a5a1acff3ceddcbe9e
DIFF: https://github.com/llvm/llvm-project/commit/81bc1365d8f85a125a6db6a5a1acff3ceddcbe9e.diff
LOG: Correct swift_bridge duplicate attribute warning logic
The swift_bridge attribute warns when the attribute is applied multiple
times to the same declaration. However, it warns about the arguments
being different to the attribute without ever checking if the arguments
actually are different. If the arguments are different, diagnose,
otherwise silently accept the code. Either way, drop the duplicated
attribute.
Added:
Modified:
clang/lib/Sema/SemaDeclAttr.cpp
clang/test/SemaObjC/attr-swift_bridge.m
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index fcb8c20f406d..b343eb9d10de 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -5751,9 +5751,11 @@ static void handleSwiftBridge(Sema &S, Decl *D, const ParsedAttr &AL) {
if (!S.checkStringLiteralArgumentAttr(AL, 0, BT))
return;
- // Don't duplicate annotations that are already set.
- if (D->hasAttr<SwiftBridgeAttr>()) {
- S.Diag(AL.getLoc(), diag::warn_duplicate_attribute) << AL;
+ // Warn about duplicate attributes if they have
diff erent arguments, but drop
+ // any duplicate attributes regardless.
+ if (const auto *Other = D->getAttr<SwiftBridgeAttr>()) {
+ if (Other->getSwiftType() != BT)
+ S.Diag(AL.getLoc(), diag::warn_duplicate_attribute) << AL;
return;
}
diff --git a/clang/test/SemaObjC/attr-swift_bridge.m b/clang/test/SemaObjC/attr-swift_bridge.m
index 1c8259a6a2e7..8f53ed815458 100644
--- a/clang/test/SemaObjC/attr-swift_bridge.m
+++ b/clang/test/SemaObjC/attr-swift_bridge.m
@@ -31,3 +31,8 @@ @protocol P
typedef NSArray *NSArrayAlias __attribute__((__swift_bridge__("ArrayAlias")));
struct __attribute__((__swift_bridge__("StructT"))) T {};
+
+// Duplicate attributes with the same arguments are fine.
+struct __attribute__((swift_bridge("foo"), swift_bridge("foo"))) S;
+// Duplicate attributes with
diff erent arguments are not.
+struct __attribute__((swift_bridge("foo"), swift_bridge("bar"))) S; // expected-warning {{attribute 'swift_bridge' is already applied with
diff erent arguments}}
More information about the cfe-commits
mailing list