r296170 - [ODRHash] Add handling of bitfields
Richard Trieu via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 24 12:59:28 PST 2017
Author: rtrieu
Date: Fri Feb 24 14:59:28 2017
New Revision: 296170
URL: http://llvm.org/viewvc/llvm-project?rev=296170&view=rev
Log:
[ODRHash] Add handling of bitfields
Differential Revision: https://reviews.llvm.org/D21675
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td
cfe/trunk/lib/AST/ODRHash.cpp
cfe/trunk/lib/Serialization/ASTReader.cpp
cfe/trunk/test/Modules/odr_hash.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td?rev=296170&r1=296169&r2=296170&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSerializationKinds.td Fri Feb 24 14:59:28 2017
@@ -133,14 +133,20 @@ def err_module_odr_violation_mismatch_de
"static assert with condition|"
"static assert with message|"
"static assert with %select{|no }4message|"
- "field %4|field %4 with type %5}3">;
+ "field %4|"
+ "field %4 with type %5|"
+ "%select{non-|}5bitfield %4|"
+ "bitfield %4 with one width expression}3">;
def note_module_odr_violation_mismatch_decl_diff : Note<"but in '%0' found "
"%select{"
"static assert with different condition|"
"static assert with different message|"
"static assert with %select{|no }2message|"
- "field %2|field %2 with type %3}1">;
+ "field %2|"
+ "field %2 with type %3|"
+ "%select{non-|}3bitfield %2|"
+ "bitfield %2 with different width expression}1">;
def warn_module_uses_date_time : Warning<
"%select{precompiled header|module}0 uses __DATE__ or __TIME__">,
Modified: cfe/trunk/lib/AST/ODRHash.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ODRHash.cpp?rev=296170&r1=296169&r2=296170&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ODRHash.cpp (original)
+++ cfe/trunk/lib/AST/ODRHash.cpp Fri Feb 24 14:59:28 2017
@@ -183,6 +183,13 @@ public:
void VisitFieldDecl(const FieldDecl *D) {
Inherited::VisitFieldDecl(D);
+
+ const bool IsBitfield = D->isBitField();
+ Hash.AddBoolean(IsBitfield);
+
+ if (IsBitfield) {
+ AddStmt(D->getBitWidth());
+ }
}
};
Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=296170&r1=296169&r2=296170&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Fri Feb 24 14:59:28 2017
@@ -9063,6 +9063,8 @@ void ASTReader::diagnoseOdrViolations()
StaticAssertOnlyMessage,
FieldName,
FieldTypeName,
+ FieldSingleBitField,
+ FieldDifferentWidthBitField
};
// These lambdas have the common portions of the ODR diagnostics. This
@@ -9213,6 +9215,30 @@ void ASTReader::diagnoseOdrViolations()
}
}
+ const bool IsFirstBitField = FirstField->isBitField();
+ const bool IsSecondBitField = SecondField->isBitField();
+ if (IsFirstBitField != IsSecondBitField) {
+ ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
+ FieldSingleBitField)
+ << FirstII << IsFirstBitField;
+ ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
+ FieldSingleBitField)
+ << SecondII << IsSecondBitField;
+ Diagnosed = true;
+ break;
+ }
+
+ if (IsFirstBitField && IsSecondBitField) {
+ ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(),
+ FieldDifferentWidthBitField)
+ << FirstII << FirstField->getBitWidth()->getSourceRange();
+ ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(),
+ FieldDifferentWidthBitField)
+ << SecondII << SecondField->getBitWidth()->getSourceRange();
+ Diagnosed = true;
+ break;
+ }
+
break;
}
}
Modified: cfe/trunk/test/Modules/odr_hash.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/odr_hash.cpp?rev=296170&r1=296169&r2=296170&view=diff
==============================================================================
--- cfe/trunk/test/Modules/odr_hash.cpp (original)
+++ cfe/trunk/test/Modules/odr_hash.cpp Fri Feb 24 14:59:28 2017
@@ -191,6 +191,47 @@ S5 s5;
// expected-note at first.h:* {{but in 'FirstModule' found field 'x' with type 'A' (aka 'int')}}
#endif
+#if defined(FIRST)
+struct S6 {
+ unsigned x;
+};
+#elif defined(SECOND)
+struct S6 {
+ unsigned x : 1;
+};
+#else
+S6 s6;
+// expected-error at second.h:* {{'Field::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found bitfield 'x'}}
+// expected-note at first.h:* {{but in 'FirstModule' found non-bitfield 'x'}}
+#endif
+
+#if defined(FIRST)
+struct S7 {
+ unsigned x : 2;
+};
+#elif defined(SECOND)
+struct S7 {
+ unsigned x : 1;
+};
+#else
+S7 s7;
+// expected-error at second.h:* {{'Field::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found bitfield 'x' with one width expression}}
+// expected-note at first.h:* {{but in 'FirstModule' found bitfield 'x' with different width expression}}
+#endif
+
+#if defined(FIRST)
+struct S8 {
+ unsigned x : 2;
+};
+#elif defined(SECOND)
+struct S8 {
+ unsigned x : 1 + 1;
+};
+#else
+S8 s8;
+// expected-error at second.h:* {{'Field::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found bitfield 'x' with one width expression}}
+// expected-note at first.h:* {{but in 'FirstModule' found bitfield 'x' with different width expression}}
+#endif
} // namespace Field
@@ -236,6 +277,9 @@ struct S {
double y;
INT z;
+
+ unsigned a : 1;
+ unsigned b : 2*2 + 5/2;
};
#elif defined(SECOND)
typedef int INT;
@@ -251,6 +295,9 @@ struct S {
double y;
INT z;
+
+ unsigned a : 1;
+ unsigned b : 2 * 2 + 5 / 2;
};
#else
S s;
@@ -271,6 +318,9 @@ struct T {
INT z;
+ unsigned a : 1;
+ unsigned b : 2 * 2 + 5 / 2;
+
private:
};
#elif defined(SECOND)
@@ -288,6 +338,9 @@ struct T {
INT z;
+ unsigned a : 1;
+ unsigned b : 2 * 2 + 5 / 2;
+
public:
};
#else
More information about the cfe-commits
mailing list