Skip to content

Commit 6519524

Browse files
authored
Merge pull request #61500 from compnerd/mutable
ClangImporter: simplify logic for mutability attribute
2 parents 7a0e642 + ad1bd8e commit 6519524

File tree

3 files changed

+12
-16
lines changed

3 files changed

+12
-16
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
}

test/Interop/Cxx/class/Inputs/mutability-annotations.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ struct HasMutableProperty {
2525

2626
int noAnnotation() const { return b; }
2727

28-
// expected-warning@+1 {{attribute 'nonmutating' is ignored when combined with attribute 'mutating'}}
28+
// expected-warning@+1 {{attribute 'mutating' is ignored when combined with attribute 'nonmutating'}}
2929
int contradictingAnnotations() const __attribute__((__swift_attr__("nonmutating"))) __attribute__((__swift_attr__("mutating"))) {
3030
return b;
3131
}

0 commit comments

Comments
 (0)