Skip to content

Commit dbe616e

Browse files
committed
ClangImporter: simplify logic for mutability attribute
Take the spellings for the attributes as parameters for the diagnostics to allow us to reference the ignored the attribute properly. Use direct pointer checks instead of an unnecessary `llvm::Optional` around a nullable pointer. Use `llvm::StringRef` to simplify the comparison. This avoids re-spelling the attribute parameters which have already been checked by `isMutabilityAttr` for the contradiction.
1 parent 73e9f27 commit dbe616e

File tree

2 files changed

+11
-15
lines changed

2 files changed

+11
-15
lines changed

include/swift/AST/DiagnosticsClangImporter.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ WARNING(import_multiple_mainactor_attr,none,
107107
(StringRef, StringRef))
108108

109109
WARNING(contradicting_mutation_attrs,none,
110-
"attribute 'nonmutating' is ignored when combined with attribute 'mutating'", ())
110+
"attribute '%0' is ignored when combined with attribute '%1'",
111+
(StringRef, StringRef))
111112

112113
WARNING(nonmutating_without_const,none,
113114
"attribute 'nonmutating' has no effect on non-const method", ())

lib/ClangImporter/ImportDecl.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7242,7 +7242,7 @@ ClangImporter::Implementation::importSwiftAttrAttributes(Decl *MappedDecl) {
72427242
ClangDecl = cast<clang::NamedDecl>(maybeDefinition.getValue());
72437243

72447244
Optional<const clang::SwiftAttrAttr *> seenMainActorAttr;
7245-
Optional<const clang::SwiftAttrAttr *> seenMutabilityAttr;
7245+
const clang::SwiftAttrAttr *seenMutabilityAttr = nullptr;
72467246
PatternBindingInitializer *initContext = nullptr;
72477247

72487248
auto importAttrsFromDecl = [&](const clang::NamedDecl *ClangDecl) {
@@ -7274,14 +7274,16 @@ ClangImporter::Implementation::importSwiftAttrAttributes(Decl *MappedDecl) {
72747274
}
72757275

72767276
if (isMutabilityAttr(swiftAttr)) {
7277+
StringRef attr = swiftAttr->getAttribute();
72777278

72787279
// Check if 'nonmutating' attr is applicable
7279-
if (swiftAttr->getAttribute() == "nonmutating") {
7280+
if (attr == "nonmutating") {
72807281
if (auto *method = dyn_cast<clang::CXXMethodDecl>(ClangDecl)) {
72817282
if (!method->isConst()) {
72827283
diagnose(HeaderLoc(swiftAttr->getLocation()),
72837284
diag::nonmutating_without_const);
72847285
}
7286+
72857287
if (!method->getParent()->hasMutableFields()) {
72867288
diagnose(HeaderLoc(swiftAttr->getLocation()),
72877289
diag::nonmutating_without_mutable_fields);
@@ -7291,18 +7293,11 @@ ClangImporter::Implementation::importSwiftAttrAttributes(Decl *MappedDecl) {
72917293

72927294
// Check for contradicting mutability attr
72937295
if (seenMutabilityAttr) {
7294-
StringRef seenAttribute =
7295-
seenMutabilityAttr.getValue()->getAttribute();
7296-
if ((seenAttribute == "nonmutating" &&
7297-
swiftAttr->getAttribute() == "mutating") ||
7298-
(seenAttribute == "mutating" &&
7299-
swiftAttr->getAttribute() == "nonmutating")) {
7300-
const clang::SwiftAttrAttr *nonmutatingAttr =
7301-
seenAttribute == "nonmutating" ? seenMutabilityAttr.getValue()
7302-
: swiftAttr;
7303-
7304-
diagnose(HeaderLoc(nonmutatingAttr->getLocation()),
7305-
diag::contradicting_mutation_attrs);
7296+
StringRef previous = seenMutabilityAttr->getAttribute();
7297+
7298+
if (previous != attr) {
7299+
diagnose(HeaderLoc(swiftAttr->getLocation()),
7300+
diag::contradicting_mutation_attrs) << attr << previous;
73067301
continue;
73077302
}
73087303
}

0 commit comments

Comments
 (0)