@@ -7242,7 +7242,7 @@ ClangImporter::Implementation::importSwiftAttrAttributes(Decl *MappedDecl) {
7242
7242
ClangDecl = cast<clang::NamedDecl>(maybeDefinition.getValue ());
7243
7243
7244
7244
Optional<const clang::SwiftAttrAttr *> seenMainActorAttr;
7245
- Optional< const clang::SwiftAttrAttr *> seenMutabilityAttr;
7245
+ const clang::SwiftAttrAttr *seenMutabilityAttr = nullptr ;
7246
7246
PatternBindingInitializer *initContext = nullptr ;
7247
7247
7248
7248
auto importAttrsFromDecl = [&](const clang::NamedDecl *ClangDecl) {
@@ -7274,14 +7274,16 @@ ClangImporter::Implementation::importSwiftAttrAttributes(Decl *MappedDecl) {
7274
7274
}
7275
7275
7276
7276
if (isMutabilityAttr (swiftAttr)) {
7277
+ StringRef attr = swiftAttr->getAttribute ();
7277
7278
7278
7279
// Check if 'nonmutating' attr is applicable
7279
- if (swiftAttr-> getAttribute () == " nonmutating" ) {
7280
+ if (attr == " nonmutating" ) {
7280
7281
if (auto *method = dyn_cast<clang::CXXMethodDecl>(ClangDecl)) {
7281
7282
if (!method->isConst ()) {
7282
7283
diagnose (HeaderLoc (swiftAttr->getLocation ()),
7283
7284
diag::nonmutating_without_const);
7284
7285
}
7286
+
7285
7287
if (!method->getParent ()->hasMutableFields ()) {
7286
7288
diagnose (HeaderLoc (swiftAttr->getLocation ()),
7287
7289
diag::nonmutating_without_mutable_fields);
@@ -7291,18 +7293,11 @@ ClangImporter::Implementation::importSwiftAttrAttributes(Decl *MappedDecl) {
7291
7293
7292
7294
// Check for contradicting mutability attr
7293
7295
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);
7306
7301
continue ;
7307
7302
}
7308
7303
}
0 commit comments