diff --git a/include/swift/AST/DiagnosticGroups.def b/include/swift/AST/DiagnosticGroups.def index 1854905d6e6..670507a1725 100644 --- a/include/swift/AST/DiagnosticGroups.def +++ b/include/swift/AST/DiagnosticGroups.def @@ -25,6 +25,7 @@ GROUP(no_group, "") GROUP(DeprecatedDeclaration, "DeprecatedDeclaration.md") GROUP(Unsafe, "Unsafe.md") GROUP(UnknownWarningGroup, "UnknownWarningGroup.md") +GROUP(PreconcurrencyImport, "PreconcurrencyImport.md") #define UNDEFINE_DIAGNOSTIC_GROUPS_MACROS #include "swift/AST/DefineDiagnosticGroupsMacros.h" diff --git a/include/swift/AST/DiagnosticsSema.def b/include/swift/AST/DiagnosticsSema.def index 342c7954d35..719939d890f 100644 --- a/include/swift/AST/DiagnosticsSema.def +++ b/include/swift/AST/DiagnosticsSema.def @@ -2710,8 +2710,9 @@ WARNING(add_predates_concurrency_import,none, "add '@preconcurrency' to %select{suppress|treat}0 " "'Sendable'-related %select{warnings|errors}0 from module %1" "%select{| as warnings}0", (bool, Identifier)) -WARNING(remove_predates_concurrency_import,none, - "'@preconcurrency' attribute on module %0 has no effect", (Identifier)) +GROUPED_WARNING(remove_predates_concurrency_import,PreconcurrencyImport, + DefaultIgnore, + "'@preconcurrency' attribute on module %0 has no effect", (Identifier)) NOTE(add_preconcurrency_to_conformance,none, "add '@preconcurrency' to the %0 conformance to defer isolation checking to run time", (DeclName)) WARNING(remove_public_import,none, diff --git a/lib/AST/DiagnosticEngine.cpp b/lib/AST/DiagnosticEngine.cpp index e707505a19c..edb50834378 100644 --- a/lib/AST/DiagnosticEngine.cpp +++ b/lib/AST/DiagnosticEngine.cpp @@ -74,6 +74,11 @@ enum class DiagnosticOptions { /// A diagnostic warning about an unused element. NoUsage, + + /// The diagnostic should be ignored by default, but will be re-enabled + /// by various warning options (-Wwarning, -Werror). This only makes sense + /// for warnings. + DefaultIgnore, }; struct StoredDiagnosticInfo { DiagnosticKind kind : 2; @@ -82,15 +87,17 @@ struct StoredDiagnosticInfo { bool isAPIDigesterBreakage : 1; bool isDeprecation : 1; bool isNoUsage : 1; + bool defaultIgnore : 1; DiagGroupID groupID; constexpr StoredDiagnosticInfo(DiagnosticKind k, bool firstBadToken, bool fatal, bool isAPIDigesterBreakage, bool deprecation, bool noUsage, - DiagGroupID groupID) + bool defaultIgnore, DiagGroupID groupID) : kind(k), pointsToFirstBadToken(firstBadToken), isFatal(fatal), isAPIDigesterBreakage(isAPIDigesterBreakage), - isDeprecation(deprecation), isNoUsage(noUsage), groupID(groupID) {} + isDeprecation(deprecation), isNoUsage(noUsage), + defaultIgnore(defaultIgnore), groupID(groupID) {} constexpr StoredDiagnosticInfo(DiagnosticKind k, DiagnosticOptions opts, DiagGroupID groupID) : StoredDiagnosticInfo(k, @@ -98,7 +105,9 @@ struct StoredDiagnosticInfo { opts == DiagnosticOptions::Fatal, opts == DiagnosticOptions::APIDigesterBreakage, opts == DiagnosticOptions::Deprecation, - opts == DiagnosticOptions::NoUsage, groupID) {} + opts == DiagnosticOptions::NoUsage, + opts == DiagnosticOptions::DefaultIgnore, + groupID) {} }; } // end anonymous namespace @@ -168,8 +177,12 @@ static constexpr EducationalNotes _EducationalNotes = static constexpr auto educationalNotes = _EducationalNotes.value; DiagnosticState::DiagnosticState() { - // Initialize our ignored diagnostics to default - ignoredDiagnostics.resize(NumDiagIDs); + // Initialize our ignored diagnostics to defaults + ignoredDiagnostics.reserve(NumDiagIDs); + for (const auto &info : storedDiagnosticInfos) { + ignoredDiagnostics.push_back(info.defaultIgnore); + } + // Initialize warningsAsErrors to default warningsAsErrors.resize(DiagGroupsCount); } @@ -547,6 +560,9 @@ void DiagnosticEngine::setWarningsAsErrorsRules( groupID && *groupID != DiagGroupID::no_group) { getDiagGroupInfoByID(*groupID).traverseDepthFirst([&](auto group) { state.setWarningsAsErrorsForDiagGroupID(*groupID, isEnabled); + for (DiagID diagID : group.diagnostics) { + state.setIgnoredDiagnostic(diagID, false); + } }); } else { unknownGroups.push_back(std::string(name)); diff --git a/test/Concurrency/predates_concurrency_import.swift b/test/Concurrency/predates_concurrency_import.swift index 5e9536687d7..1f50a49768a 100644 --- a/test/Concurrency/predates_concurrency_import.swift +++ b/test/Concurrency/predates_concurrency_import.swift @@ -3,9 +3,9 @@ // RUN: %target-swift-frontend -emit-module -emit-module-path %t/NonStrictModule.swiftmodule -module-name NonStrictModule %S/Inputs/NonStrictModule.swift // RUN: %target-swift-frontend -emit-module -emit-module-path %t/OtherActors.swiftmodule -module-name OtherActors %S/Inputs/OtherActors.swift -target %target-swift-5.1-abi-triple -// RUN: %target-swift-frontend -I %t %s -emit-sil -o /dev/null -verify -parse-as-library -enable-upcoming-feature GlobalConcurrency -// RUN: %target-swift-frontend -I %t %s -emit-sil -o /dev/null -verify -strict-concurrency=targeted -parse-as-library -enable-upcoming-feature GlobalConcurrency -// RUN: %target-swift-frontend -I %t %s -emit-sil -o /dev/null -verify -strict-concurrency=complete -parse-as-library -enable-upcoming-feature GlobalConcurrency +// RUN: %target-swift-frontend -I %t %s -emit-sil -o /dev/null -verify -parse-as-library -enable-upcoming-feature GlobalConcurrency -Wwarning PreconcurrencyImport +// RUN: %target-swift-frontend -I %t %s -emit-sil -o /dev/null -verify -strict-concurrency=targeted -parse-as-library -enable-upcoming-feature GlobalConcurrency -Wwarning PreconcurrencyImport +// RUN: %target-swift-frontend -I %t %s -emit-sil -o /dev/null -verify -strict-concurrency=complete -parse-as-library -enable-upcoming-feature GlobalConcurrency -Wwarning PreconcurrencyImport // REQUIRES: concurrency // REQUIRES: swift_feature_GlobalConcurrency diff --git a/test/Concurrency/predates_concurrency_import_nowarn.swift b/test/Concurrency/predates_concurrency_import_nowarn.swift new file mode 100644 index 00000000000..bf6652516d8 --- /dev/null +++ b/test/Concurrency/predates_concurrency_import_nowarn.swift @@ -0,0 +1,9 @@ +// RUN: %empty-directory(%t) + +// RUN: %target-swift-frontend -emit-module -emit-module-path %t/OtherActors.swiftmodule -module-name OtherActors %S/Inputs/OtherActors.swift -target %target-swift-5.1-abi-triple + +// RUN: %target-swift-frontend -I %t %s -emit-sil -o /dev/null -verify -parse-as-library + +// REQUIRES: concurrency + +@preconcurrency import OtherActors diff --git a/userdocs/diagnostic_groups/PreconcurrencyImport.md b/userdocs/diagnostic_groups/PreconcurrencyImport.md new file mode 100644 index 00000000000..c436c5f7fd8 --- /dev/null +++ b/userdocs/diagnostic_groups/PreconcurrencyImport.md @@ -0,0 +1,6 @@ +# Extraneous @preconcurrency imports + + +This diagnostic group includes warnings that diagnose `@preconcurrency import` +declarations that don't need `@preconcurrency`. It is an experimental warning +that is currently disabled. \ No newline at end of file