[clang] 15cb180 - [ODRHash diagnostics] Split `err_module_odr_violation_mismatch_decl_diff` into per-entity diagnostics. NFC.
Volodymyr Sapsai via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 30 18:41:06 PDT 2022
Author: Volodymyr Sapsai
Date: 2022-06-30T18:40:46-07:00
New Revision: 15cb180dcbf84701f3af47983e223d0beaac3c9b
URL: https://github.com/llvm/llvm-project/commit/15cb180dcbf84701f3af47983e223d0beaac3c9b
DIFF: https://github.com/llvm/llvm-project/commit/15cb180dcbf84701f3af47983e223d0beaac3c9b.diff
LOG: [ODRHash diagnostics] Split `err_module_odr_violation_mismatch_decl_diff` into per-entity diagnostics. NFC.
We'll need to add more cases for Objective-C entities and adding
everything to `err_module_odr_violation_mismatch_decl_diff` makes it
harder to work with over time.
Differential Revision: https://reviews.llvm.org/D128488
Added:
Modified:
clang/include/clang/Basic/DiagnosticSerializationKinds.td
clang/lib/Serialization/ASTReader.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticSerializationKinds.td b/clang/include/clang/Basic/DiagnosticSerializationKinds.td
index 251242e46fe5..0bd3734a4a04 100644
--- a/clang/include/clang/Basic/DiagnosticSerializationKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSerializationKinds.td
@@ -177,20 +177,13 @@ def note_module_odr_violation_mismatch_decl : Note<"but in '%0' found "
"protected access specifier|static assert|field|method|type alias|typedef|"
"data member|friend declaration|function template}1">;
-def err_module_odr_violation_mismatch_decl_
diff : Error<
+def err_module_odr_violation_record : Error<
"%q0 has
diff erent definitions in
diff erent modules; first
diff erence is "
"%select{definition in module '%2'|defined here}1 found "
"%select{"
"static assert with condition|"
"static assert with message|"
"static assert with %select{|no }4message|"
- "field %4|"
- "field %4 with type %5|"
- "%select{non-|}5bitfield %4|"
- "bitfield %4 with one width expression|"
- "%select{non-|}5mutable field %4|"
- "field %4 with %select{no|an}5 initalizer|"
- "field %4 with an initializer|"
"%select{method %5|constructor|destructor}4|"
"%select{method %5|constructor|destructor}4 "
"is %select{not deleted|deleted}6|"
@@ -226,13 +219,6 @@ def err_module_odr_violation_mismatch_decl_
diff : Error<
"with %select{no body|body}6|"
"%select{method %5|constructor|destructor}4 "
"with body|"
- "%select{typedef|type alias}4 name %5|"
- "%select{typedef|type alias}4 %5 with underlying type %6|"
- "data member with name %4|"
- "data member %4 with type %5|"
- "data member %4 with%select{out|}5 an initializer|"
- "data member %4 with an initializer|"
- "data member %4 %select{is constexpr|is not constexpr}5|"
"friend %select{class|function}4|"
"friend %4|"
"friend function %4|"
@@ -250,18 +236,11 @@ def err_module_odr_violation_mismatch_decl_
diff : Error<
"being a template parameter pack|"
"}3">;
-def note_module_odr_violation_mismatch_decl_
diff : Note<"but in '%0' found "
+def note_module_odr_violation_record : Note<"but in '%0' found "
"%select{"
"static assert with
diff erent condition|"
"static assert with
diff erent message|"
"static assert with %select{|no }2message|"
- "field %2|"
- "field %2 with type %3|"
- "%select{non-|}3bitfield %2|"
- "bitfield %2 with
diff erent width expression|"
- "%select{non-|}3mutable field %2|"
- "field %2 with %select{no|an}3 initializer|"
- "field %2 with a
diff erent initializer|"
"%select{method %3|constructor|destructor}2|"
"%select{method %3|constructor|destructor}2 "
"is %select{not deleted|deleted}4|"
@@ -297,13 +276,6 @@ def note_module_odr_violation_mismatch_decl_
diff : Note<"but in '%0' found "
"with %select{no body|body}4|"
"%select{method %3|constructor|destructor}2 "
"with
diff erent body|"
- "%select{typedef|type alias}2 name %3|"
- "%select{typedef|type alias}2 %3 with
diff erent underlying type %4|"
- "data member with name %2|"
- "data member %2 with
diff erent type %3|"
- "data member %2 with%select{out|}3 an initializer|"
- "data member %2 with a
diff erent initializer|"
- "data member %2 %select{is constexpr|is not constexpr}3|"
"friend %select{class|function}2|"
"friend %2|"
"friend function %2|"
@@ -321,6 +293,61 @@ def note_module_odr_violation_mismatch_decl_
diff : Note<"but in '%0' found "
"being a template parameter pack|"
"}1">;
+def err_module_odr_violation_field : Error<
+ "%q0 has
diff erent definitions in
diff erent modules; first
diff erence is "
+ "%select{definition in module '%2'|defined here}1 found "
+ "%select{"
+ "field %4|"
+ "field %4 with type %5|"
+ "%select{non-|}5bitfield %4|"
+ "bitfield %4 with one width expression|"
+ "%select{non-|}5mutable field %4|"
+ "field %4 with %select{no|an}5 initalizer|"
+ "field %4 with an initializer"
+ "}3">;
+def note_module_odr_violation_field : Note<"but in '%0' found "
+ "%select{"
+ "field %2|"
+ "field %2 with type %3|"
+ "%select{non-|}3bitfield %2|"
+ "bitfield %2 with
diff erent width expression|"
+ "%select{non-|}3mutable field %2|"
+ "field %2 with %select{no|an}3 initializer|"
+ "field %2 with a
diff erent initializer"
+ "}1">;
+
+def err_module_odr_violation_typedef : Error<
+ "%q0 has
diff erent definitions in
diff erent modules; first
diff erence is "
+ "%select{definition in module '%2'|defined here}1 found "
+ "%select{"
+ "%select{typedef|type alias}4 name %5|"
+ "%select{typedef|type alias}4 %5 with underlying type %6"
+ "}3">;
+def note_module_odr_violation_typedef : Note<"but in '%0' found "
+ "%select{"
+ "%select{typedef|type alias}2 name %3|"
+ "%select{typedef|type alias}2 %3 with
diff erent underlying type %4"
+ "}1">;
+
+def err_module_odr_violation_variable : Error<
+ "%q0 has
diff erent definitions in
diff erent modules; first
diff erence is "
+ "%select{definition in module '%2'|defined here}1 found "
+ "%select{"
+ "data member with name %4|"
+ "data member %4 with type %5|"
+ "data member %4 with%select{out|}5 an initializer|"
+ "data member %4 with an initializer|"
+ "data member %4 %select{is constexpr|is not constexpr}5"
+ "}3">;
+def note_module_odr_violation_variable : Note<"but in '%0' found "
+ "%select{"
+ "data member with name %2|"
+ "data member %2 with
diff erent type %3|"
+ "data member %2 with%select{out|}3 an initializer|"
+ "data member %2 with a
diff erent initializer|"
+ "data member %2 %select{is constexpr|is not constexpr}3"
+ "}1">;
+
def err_module_odr_violation_function : Error<
"%q0 has
diff erent definitions in
diff erent modules; "
"%select{definition in module '%2'|defined here}1 "
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 6bfd81634f50..37371eff28ef 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -9637,19 +9637,12 @@ void ASTReader::diagnoseOdrViolations() {
Other
};
- // Used with err_module_odr_violation_mismatch_decl_
diff and
- // note_module_odr_violation_mismatch_decl_
diff
- enum ODRMismatchDeclDifference {
+ // Used with err_module_odr_violation_record and
+ // note_module_odr_violation_record
+ enum ODRCXXRecordDifference {
StaticAssertCondition,
StaticAssertMessage,
StaticAssertOnlyMessage,
- FieldName,
- FieldTypeName,
- FieldSingleBitField,
- FieldDifferentWidthBitField,
- FieldSingleMutable,
- FieldSingleInitializer,
- FieldDifferentInitializers,
MethodName,
MethodDeleted,
MethodDefaulted,
@@ -9668,13 +9661,6 @@ void ASTReader::diagnoseOdrViolations() {
MethodDifferentTemplateArgument,
MethodSingleBody,
MethodDifferentBody,
- TypedefName,
- TypedefType,
- VarName,
- VarType,
- VarSingleInitializer,
- VarDifferentInitializer,
- VarConstexpr,
FriendTypeFunction,
FriendType,
FriendFunction,
@@ -9694,17 +9680,27 @@ void ASTReader::diagnoseOdrViolations() {
NamedDecl *FirstRecord, StringRef FirstModule,
StringRef SecondModule, FieldDecl *FirstField,
FieldDecl *SecondField) {
+ enum ODRFieldDifference {
+ FieldName,
+ FieldTypeName,
+ FieldSingleBitField,
+ FieldDifferentWidthBitField,
+ FieldSingleMutable,
+ FieldSingleInitializer,
+ FieldDifferentInitializers,
+ };
+
auto DiagError = [FirstRecord, FirstField, FirstModule,
- this](ODRMismatchDeclDifference DiffType) {
+ this](ODRFieldDifference DiffType) {
return Diag(FirstField->getLocation(),
- diag::err_module_odr_violation_mismatch_decl_
diff )
+ diag::err_module_odr_violation_field)
<< FirstRecord << FirstModule.empty() << FirstModule
<< FirstField->getSourceRange() << DiffType;
};
auto DiagNote = [SecondField, SecondModule,
- this](ODRMismatchDeclDifference DiffType) {
+ this](ODRFieldDifference DiffType) {
return Diag(SecondField->getLocation(),
- diag::note_module_odr_violation_mismatch_decl_
diff )
+ diag::note_module_odr_violation_field)
<< SecondModule << SecondField->getSourceRange() << DiffType;
};
@@ -9792,17 +9788,22 @@ void ASTReader::diagnoseOdrViolations() {
NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule,
TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD,
bool IsTypeAlias) {
+ enum ODRTypedefDifference {
+ TypedefName,
+ TypedefType,
+ };
+
auto DiagError = [FirstRecord, FirstTD, FirstModule,
- this](ODRMismatchDeclDifference DiffType) {
+ this](ODRTypedefDifference DiffType) {
return Diag(FirstTD->getLocation(),
- diag::err_module_odr_violation_mismatch_decl_
diff )
+ diag::err_module_odr_violation_typedef)
<< FirstRecord << FirstModule.empty() << FirstModule
<< FirstTD->getSourceRange() << DiffType;
};
auto DiagNote = [SecondTD, SecondModule,
- this](ODRMismatchDeclDifference DiffType) {
+ this](ODRTypedefDifference DiffType) {
return Diag(SecondTD->getLocation(),
- diag::note_module_odr_violation_mismatch_decl_
diff )
+ diag::note_module_odr_violation_typedef)
<< SecondModule << SecondTD->getSourceRange() << DiffType;
};
@@ -9830,17 +9831,24 @@ void ASTReader::diagnoseOdrViolations() {
this](NamedDecl *FirstRecord, StringRef FirstModule,
StringRef SecondModule, VarDecl *FirstVD,
VarDecl *SecondVD) {
+ enum ODRVarDifference {
+ VarName,
+ VarType,
+ VarSingleInitializer,
+ VarDifferentInitializer,
+ VarConstexpr,
+ };
+
auto DiagError = [FirstRecord, FirstVD, FirstModule,
- this](ODRMismatchDeclDifference DiffType) {
+ this](ODRVarDifference DiffType) {
return Diag(FirstVD->getLocation(),
- diag::err_module_odr_violation_mismatch_decl_
diff )
+ diag::err_module_odr_violation_variable)
<< FirstRecord << FirstModule.empty() << FirstModule
<< FirstVD->getSourceRange() << DiffType;
};
- auto DiagNote = [SecondVD, SecondModule,
- this](ODRMismatchDeclDifference DiffType) {
+ auto DiagNote = [SecondVD, SecondModule, this](ODRVarDifference DiffType) {
return Diag(SecondVD->getLocation(),
- diag::note_module_odr_violation_mismatch_decl_
diff )
+ diag::note_module_odr_violation_variable)
<< SecondModule << SecondVD->getSourceRange() << DiffType;
};
@@ -10053,15 +10061,15 @@ void ASTReader::diagnoseOdrViolations() {
std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord);
auto ODRDiagDeclError = [FirstRecord, &FirstModule,
this](SourceLocation Loc, SourceRange Range,
- ODRMismatchDeclDifference DiffType) {
- return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_
diff )
+ ODRCXXRecordDifference DiffType) {
+ return Diag(Loc, diag::err_module_odr_violation_record)
<< FirstRecord << FirstModule.empty() << FirstModule << Range
<< DiffType;
};
auto ODRDiagDeclNote = [&SecondModule,
this](SourceLocation Loc, SourceRange Range,
- ODRMismatchDeclDifference DiffType) {
- return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_
diff )
+ ODRCXXRecordDifference DiffType) {
+ return Diag(Loc, diag::note_module_odr_violation_record)
<< SecondModule << Range << DiffType;
};
@@ -10388,13 +10396,13 @@ void ASTReader::diagnoseOdrViolations() {
DeclarationName FirstName = FirstMethod->getDeclName();
DeclarationName SecondName = SecondMethod->getDeclName();
auto DiagMethodError = [&ODRDiagDeclError, FirstMethod, FirstMethodType,
- FirstName](ODRMismatchDeclDifference DiffType) {
+ FirstName](ODRCXXRecordDifference DiffType) {
return ODRDiagDeclError(FirstMethod->getLocation(),
FirstMethod->getSourceRange(), DiffType)
<< FirstMethodType << FirstName;
};
auto DiagMethodNote = [&ODRDiagDeclNote, SecondMethod, SecondMethodType,
- SecondName](ODRMismatchDeclDifference DiffType) {
+ SecondName](ODRCXXRecordDifference DiffType) {
return ODRDiagDeclNote(SecondMethod->getLocation(),
SecondMethod->getSourceRange(), DiffType)
<< SecondMethodType << SecondName;
@@ -10729,13 +10737,13 @@ void ASTReader::diagnoseOdrViolations() {
SecondTemplate->getTemplateParameters();
auto DiagTemplateError = [&ODRDiagDeclError, FirstTemplate](
- ODRMismatchDeclDifference DiffType) {
+ ODRCXXRecordDifference DiffType) {
return ODRDiagDeclError(FirstTemplate->getLocation(),
FirstTemplate->getSourceRange(), DiffType)
<< FirstTemplate;
};
auto DiagTemplateNote = [&ODRDiagDeclNote, SecondTemplate](
- ODRMismatchDeclDifference DiffType) {
+ ODRCXXRecordDifference DiffType) {
return ODRDiagDeclNote(SecondTemplate->getLocation(),
SecondTemplate->getSourceRange(), DiffType)
<< SecondTemplate;
More information about the cfe-commits
mailing list