@@ -74,6 +74,11 @@ enum class DiagnosticOptions {
7474
7575 // / A diagnostic warning about an unused element.
7676 NoUsage,
77+
78+ // / The diagnostic should be ignored by default, but will be re-enabled
79+ // / by various warning options (-Wwarning, -Werror). This only makes sense
80+ // / for warnings.
81+ DefaultIgnore,
7782};
7883struct StoredDiagnosticInfo {
7984 DiagnosticKind kind : 2 ;
@@ -82,23 +87,27 @@ struct StoredDiagnosticInfo {
8287 bool isAPIDigesterBreakage : 1 ;
8388 bool isDeprecation : 1 ;
8489 bool isNoUsage : 1 ;
90+ bool defaultIgnore : 1 ;
8591 DiagGroupID groupID;
8692
8793 constexpr StoredDiagnosticInfo (DiagnosticKind k, bool firstBadToken,
8894 bool fatal, bool isAPIDigesterBreakage,
8995 bool deprecation, bool noUsage,
90- DiagGroupID groupID)
96+ bool defaultIgnore, DiagGroupID groupID)
9197 : kind(k), pointsToFirstBadToken(firstBadToken), isFatal(fatal),
9298 isAPIDigesterBreakage(isAPIDigesterBreakage),
93- isDeprecation(deprecation), isNoUsage(noUsage), groupID(groupID) {}
99+ isDeprecation(deprecation), isNoUsage(noUsage),
100+ defaultIgnore(defaultIgnore), groupID(groupID) {}
94101 constexpr StoredDiagnosticInfo (DiagnosticKind k, DiagnosticOptions opts,
95102 DiagGroupID groupID)
96103 : StoredDiagnosticInfo(k,
97104 opts == DiagnosticOptions::PointsToFirstBadToken,
98105 opts == DiagnosticOptions::Fatal,
99106 opts == DiagnosticOptions::APIDigesterBreakage,
100107 opts == DiagnosticOptions::Deprecation,
101- opts == DiagnosticOptions::NoUsage, groupID) {}
108+ opts == DiagnosticOptions::NoUsage,
109+ opts == DiagnosticOptions::DefaultIgnore,
110+ groupID) {}
102111};
103112} // end anonymous namespace
104113
@@ -168,8 +177,12 @@ static constexpr EducationalNotes<NumDiagIDs> _EducationalNotes =
168177static constexpr auto educationalNotes = _EducationalNotes.value;
169178
170179DiagnosticState::DiagnosticState () {
171- // Initialize our ignored diagnostics to default
172- ignoredDiagnostics.resize (NumDiagIDs);
180+ // Initialize our ignored diagnostics to defaults
181+ ignoredDiagnostics.reserve (NumDiagIDs);
182+ for (const auto &info : storedDiagnosticInfos) {
183+ ignoredDiagnostics.push_back (info.defaultIgnore );
184+ }
185+
173186 // Initialize warningsAsErrors to default
174187 warningsAsErrors.resize (DiagGroupsCount);
175188}
@@ -547,6 +560,9 @@ void DiagnosticEngine::setWarningsAsErrorsRules(
547560 groupID && *groupID != DiagGroupID::no_group) {
548561 getDiagGroupInfoByID (*groupID).traverseDepthFirst ([&](auto group) {
549562 state.setWarningsAsErrorsForDiagGroupID (*groupID, isEnabled);
563+ for (DiagID diagID : group.diagnostics ) {
564+ state.setIgnoredDiagnostic (diagID, false );
565+ }
550566 });
551567 } else {
552568 unknownGroups.push_back (std::string (name));
0 commit comments