Merge "Diff array types" am: 9b286a1967 am: e380c2f9cc am: ab164d548b

Original change: https://android-review.googlesource.com/c/platform/development/+/2385933

Change-Id: I7055cf8f16a3b4ede0f26d8629d4cbbf8ae1de61
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Hsin-Yi Chen
2023-02-02 22:30:40 +00:00
committed by Automerger Merge Worker
9 changed files with 712 additions and 54 deletions

View File

@@ -748,6 +748,19 @@ DiffStatus AbiDiffHelper::CompareQualifiedTypes(
type_queue, diff_kind);
}
DiffStatus AbiDiffHelper::CompareArrayTypes(const ArrayTypeIR *old_type,
const ArrayTypeIR *new_type,
std::deque<std::string> *type_queue,
DiffMessageIR::DiffKind diff_kind) {
if (!CompareSizeAndAlignment(old_type, new_type) ||
old_type->IsOfUnknownBound() != new_type->IsOfUnknownBound()) {
return DiffStatus::kDirectDiff;
}
return CompareAndDumpTypeDiff(old_type->GetReferencedType(),
new_type->GetReferencedType(), type_queue,
diff_kind);
}
DiffStatus AbiDiffHelper::ComparePointerTypes(
const PointerTypeIR *old_type,
const PointerTypeIR *new_type,
@@ -970,65 +983,59 @@ DiffStatus AbiDiffHelper::CompareAndDumpTypeDiff(
return DiffStatus::kNoDiff;
}
if (kind == LinkableMessageKind::BuiltinTypeKind) {
return CompareBuiltinTypes(
static_cast<const BuiltinTypeIR *>(old_type),
static_cast<const BuiltinTypeIR *>(new_type));
}
switch (kind) {
case LinkableMessageKind::BuiltinTypeKind:
return CompareBuiltinTypes(static_cast<const BuiltinTypeIR *>(old_type),
static_cast<const BuiltinTypeIR *>(new_type));
case LinkableMessageKind::QualifiedTypeKind:
return CompareQualifiedTypes(
static_cast<const QualifiedTypeIR *>(old_type),
static_cast<const QualifiedTypeIR *>(new_type), type_queue,
diff_kind);
case LinkableMessageKind::ArrayTypeKind:
return CompareArrayTypes(static_cast<const ArrayTypeIR *>(old_type),
static_cast<const ArrayTypeIR *>(new_type),
type_queue, diff_kind);
case LinkableMessageKind::EnumTypeKind:
return CompareEnumTypes(static_cast<const EnumTypeIR *>(old_type),
static_cast<const EnumTypeIR *>(new_type),
type_queue, diff_kind);
if (kind == LinkableMessageKind::QualifiedTypeKind) {
return CompareQualifiedTypes(
static_cast<const QualifiedTypeIR *>(old_type),
static_cast<const QualifiedTypeIR *>(new_type),
type_queue, diff_kind);
}
case LinkableMessageKind::LvalueReferenceTypeKind:
return CompareLvalueReferenceTypes(
static_cast<const LvalueReferenceTypeIR *>(old_type),
static_cast<const LvalueReferenceTypeIR *>(new_type), type_queue,
diff_kind);
case LinkableMessageKind::RvalueReferenceTypeKind:
return CompareRvalueReferenceTypes(
static_cast<const RvalueReferenceTypeIR *>(old_type),
static_cast<const RvalueReferenceTypeIR *>(new_type), type_queue,
diff_kind);
case LinkableMessageKind::PointerTypeKind:
return ComparePointerTypes(static_cast<const PointerTypeIR *>(old_type),
static_cast<const PointerTypeIR *>(new_type),
type_queue, diff_kind);
if (kind == LinkableMessageKind::EnumTypeKind) {
return CompareEnumTypes(
static_cast<const EnumTypeIR *>(old_type),
static_cast<const EnumTypeIR *>(new_type),
type_queue, diff_kind);
}
case LinkableMessageKind::RecordTypeKind:
return CompareRecordTypes(static_cast<const RecordTypeIR *>(old_type),
static_cast<const RecordTypeIR *>(new_type),
type_queue, diff_kind);
if (kind == LinkableMessageKind::LvalueReferenceTypeKind) {
return CompareLvalueReferenceTypes(
static_cast<const LvalueReferenceTypeIR *>(old_type),
static_cast<const LvalueReferenceTypeIR *>(new_type),
type_queue, diff_kind);
}
if (kind == LinkableMessageKind::RvalueReferenceTypeKind) {
return CompareRvalueReferenceTypes(
static_cast<const RvalueReferenceTypeIR *>(old_type),
static_cast<const RvalueReferenceTypeIR *>(new_type),
type_queue, diff_kind);
}
if (kind == LinkableMessageKind::PointerTypeKind) {
return ComparePointerTypes(
static_cast<const PointerTypeIR *>(old_type),
static_cast<const PointerTypeIR *>(new_type),
type_queue, diff_kind);
}
if (kind == LinkableMessageKind::RecordTypeKind) {
return CompareRecordTypes(
static_cast<const RecordTypeIR *>(old_type),
static_cast<const RecordTypeIR *>(new_type),
type_queue, diff_kind);
}
if (kind == LinkableMessageKind::FunctionTypeKind) {
DiffStatus result = CompareFunctionTypes(
static_cast<const FunctionTypeIR *>(old_type),
static_cast<const FunctionTypeIR *>(new_type), type_queue, diff_kind);
// Do not allow extending function pointers, function references, etc.
if (result.IsExtension()) {
result.CombineWith(DiffStatus::kDirectDiff);
case LinkableMessageKind::FunctionTypeKind: {
DiffStatus result = CompareFunctionTypes(
static_cast<const FunctionTypeIR *>(old_type),
static_cast<const FunctionTypeIR *>(new_type), type_queue, diff_kind);
// Do not allow extending function pointers, function references, etc.
if (result.IsExtension()) {
result.CombineWith(DiffStatus::kDirectDiff);
}
return result;
}
return result;
case LinkableMessageKind::FunctionKind:
case LinkableMessageKind::GlobalVarKind:
llvm::errs() << "Unexpected LinkableMessageKind: " << kind << "\n";
::exit(1);
}
return DiffStatus::kNoDiff;
}
static DiffStatus CompareDistinctKindMessages(

View File

@@ -139,6 +139,11 @@ class AbiDiffHelper {
std::deque<std::string> *type_queue,
IRDiffDumper::DiffKind diff_kind);
DiffStatus CompareArrayTypes(const ArrayTypeIR *old_type,
const ArrayTypeIR *new_type,
std::deque<std::string> *type_queue,
IRDiffDumper::DiffKind diff_kind);
DiffStatus ComparePointerTypes(const PointerTypeIR *old_type,
const PointerTypeIR *new_type,
std::deque<std::string> *type_queue,

View File

@@ -0,0 +1,13 @@
struct Struct {
int array[0];
};
extern "C" {
void StructMember(Struct &);
void Pointer(int[]);
void DoublePointer(int **);
void PointerToArray(int (*)[]);
void PointerTo2DArray(int (*)[][10]);
void Reference(int (&)[][1]);
void Element(int (*)[2]);
}

View File

@@ -0,0 +1,13 @@
struct Struct {
int array[];
};
extern "C" {
void StructMember(Struct &);
void Pointer(int *);
void DoublePointer(int *[]);
void PointerToArray(int (*)[10]);
void PointerTo2DArray(int (*)[10][10]);
void Reference(int (&)[][11]);
void Element(short (*)[2]);
}

View File

@@ -0,0 +1,10 @@
libarray {
global:
StructMember;
Pointer;
DoublePointer;
PointerToArray;
PointerTo2DArray;
Reference;
Element;
};

View File

@@ -754,6 +754,24 @@ TEST_MODULES = [
linker_flags=['-output-format', 'Json'],
has_reference_dump=True,
),
LsdumpModule(
name='libarray',
arch='arm64',
srcs=['integration/array/include/base.h'],
version_script='integration/array/map.txt',
export_include_dirs=['integration/array/include'],
linker_flags=['-output-format', 'Json'],
has_reference_dump=True,
),
LsdumpModule(
name='libarray_diff',
arch='arm64',
srcs=['integration/array/include/diff.h'],
version_script='integration/array/map.txt',
export_include_dirs=['integration/array/include'],
linker_flags=['-output-format', 'Json'],
has_reference_dump=True,
),
]
TEST_MODULES = {m.name: m for m in TEST_MODULES}

View File

@@ -0,0 +1,286 @@
{
"array_types" :
[
{
"alignment" : 4,
"linker_set_key" : "_ZTIA0_i",
"name" : "int[0]",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIA0_i",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"alignment" : 4,
"linker_set_key" : "_ZTIA10_i",
"name" : "int[10]",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIA10_i",
"size" : 40,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"alignment" : 4,
"linker_set_key" : "_ZTIA1_i",
"name" : "int[1]",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIA1_i",
"size" : 4,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"alignment" : 4,
"linker_set_key" : "_ZTIA2_i",
"name" : "int[2]",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIA2_i",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"is_of_unknown_bound" : true,
"linker_set_key" : "_ZTIA_A10_i",
"name" : "int[][10]",
"referenced_type" : "_ZTIA10_i",
"self_type" : "_ZTIA_A10_i",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"is_of_unknown_bound" : true,
"linker_set_key" : "_ZTIA_A1_i",
"name" : "int[][1]",
"referenced_type" : "_ZTIA1_i",
"self_type" : "_ZTIA_A1_i",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"is_of_unknown_bound" : true,
"linker_set_key" : "_ZTIA_i",
"name" : "int[]",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIA_i",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
}
],
"builtin_types" :
[
{
"alignment" : 4,
"is_integral" : true,
"linker_set_key" : "_ZTIi",
"name" : "int",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIi",
"size" : 4
},
{
"linker_set_key" : "_ZTIv",
"name" : "void",
"referenced_type" : "_ZTIv",
"self_type" : "_ZTIv"
}
],
"elf_functions" :
[
{
"name" : "DoublePointer"
},
{
"name" : "Element"
},
{
"name" : "Pointer"
},
{
"name" : "PointerTo2DArray"
},
{
"name" : "PointerToArray"
},
{
"name" : "Reference"
},
{
"name" : "StructMember"
}
],
"elf_objects" : [],
"enum_types" : [],
"function_types" : [],
"functions" :
[
{
"function_name" : "DoublePointer",
"linker_set_key" : "DoublePointer",
"parameters" :
[
{
"referenced_type" : "_ZTIPPi"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"function_name" : "Element",
"linker_set_key" : "Element",
"parameters" :
[
{
"referenced_type" : "_ZTIPA2_i"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"function_name" : "Pointer",
"linker_set_key" : "Pointer",
"parameters" :
[
{
"referenced_type" : "_ZTIPi"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"function_name" : "PointerTo2DArray",
"linker_set_key" : "PointerTo2DArray",
"parameters" :
[
{
"referenced_type" : "_ZTIPA_A10_i"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"function_name" : "PointerToArray",
"linker_set_key" : "PointerToArray",
"parameters" :
[
{
"referenced_type" : "_ZTIPA_i"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"function_name" : "Reference",
"linker_set_key" : "Reference",
"parameters" :
[
{
"referenced_type" : "_ZTIRA_A1_i"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"function_name" : "StructMember",
"linker_set_key" : "StructMember",
"parameters" :
[
{
"referenced_type" : "_ZTIR6Struct"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
}
],
"global_vars" : [],
"lvalue_reference_types" :
[
{
"alignment" : 8,
"linker_set_key" : "_ZTIR6Struct",
"name" : "Struct &",
"referenced_type" : "_ZTI6Struct",
"self_type" : "_ZTIR6Struct",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIRA_A1_i",
"name" : "int (&)[][1]",
"referenced_type" : "_ZTIA_A1_i",
"self_type" : "_ZTIRA_A1_i",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
}
],
"pointer_types" :
[
{
"alignment" : 8,
"linker_set_key" : "_ZTIPA2_i",
"name" : "int (*)[2]",
"referenced_type" : "_ZTIA2_i",
"self_type" : "_ZTIPA2_i",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPA_A10_i",
"name" : "int (*)[][10]",
"referenced_type" : "_ZTIA_A10_i",
"self_type" : "_ZTIPA_A10_i",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPA_i",
"name" : "int (*)[]",
"referenced_type" : "_ZTIA_i",
"self_type" : "_ZTIPA_i",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPPi",
"name" : "int **",
"referenced_type" : "_ZTIPi",
"self_type" : "_ZTIPPi",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPi",
"name" : "int *",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIPi",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
}
],
"qualified_types" : [],
"record_types" :
[
{
"alignment" : 4,
"fields" :
[
{
"field_name" : "array",
"referenced_type" : "_ZTIA0_i"
}
],
"linker_set_key" : "_ZTI6Struct",
"name" : "Struct",
"referenced_type" : "_ZTI6Struct",
"self_type" : "_ZTI6Struct",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h"
}
],
"rvalue_reference_types" : []
}

View File

@@ -0,0 +1,288 @@
{
"array_types" :
[
{
"alignment" : 4,
"linker_set_key" : "_ZTIA10_A10_i",
"name" : "int[10][10]",
"referenced_type" : "_ZTIA10_i",
"self_type" : "_ZTIA10_A10_i",
"size" : 400,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"alignment" : 4,
"linker_set_key" : "_ZTIA10_i",
"name" : "int[10]",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIA10_i",
"size" : 40,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"alignment" : 4,
"linker_set_key" : "_ZTIA11_i",
"name" : "int[11]",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIA11_i",
"size" : 44,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"alignment" : 2,
"linker_set_key" : "_ZTIA2_s",
"name" : "short[2]",
"referenced_type" : "_ZTIs",
"self_type" : "_ZTIA2_s",
"size" : 4,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"is_of_unknown_bound" : true,
"linker_set_key" : "_ZTIA_A11_i",
"name" : "int[][11]",
"referenced_type" : "_ZTIA11_i",
"self_type" : "_ZTIA_A11_i",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"is_of_unknown_bound" : true,
"linker_set_key" : "_ZTIA_i",
"name" : "int[]",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIA_i",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
}
],
"builtin_types" :
[
{
"alignment" : 4,
"is_integral" : true,
"linker_set_key" : "_ZTIi",
"name" : "int",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIi",
"size" : 4
},
{
"alignment" : 2,
"is_integral" : true,
"linker_set_key" : "_ZTIs",
"name" : "short",
"referenced_type" : "_ZTIs",
"self_type" : "_ZTIs",
"size" : 2
},
{
"linker_set_key" : "_ZTIv",
"name" : "void",
"referenced_type" : "_ZTIv",
"self_type" : "_ZTIv"
}
],
"elf_functions" :
[
{
"name" : "DoublePointer"
},
{
"name" : "Element"
},
{
"name" : "Pointer"
},
{
"name" : "PointerTo2DArray"
},
{
"name" : "PointerToArray"
},
{
"name" : "Reference"
},
{
"name" : "StructMember"
}
],
"elf_objects" : [],
"enum_types" : [],
"function_types" : [],
"functions" :
[
{
"function_name" : "DoublePointer",
"linker_set_key" : "DoublePointer",
"parameters" :
[
{
"referenced_type" : "_ZTIPPi"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"function_name" : "Element",
"linker_set_key" : "Element",
"parameters" :
[
{
"referenced_type" : "_ZTIPA2_s"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"function_name" : "Pointer",
"linker_set_key" : "Pointer",
"parameters" :
[
{
"referenced_type" : "_ZTIPi"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"function_name" : "PointerTo2DArray",
"linker_set_key" : "PointerTo2DArray",
"parameters" :
[
{
"referenced_type" : "_ZTIPA10_A10_i"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"function_name" : "PointerToArray",
"linker_set_key" : "PointerToArray",
"parameters" :
[
{
"referenced_type" : "_ZTIPA10_i"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"function_name" : "Reference",
"linker_set_key" : "Reference",
"parameters" :
[
{
"referenced_type" : "_ZTIRA_A11_i"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"function_name" : "StructMember",
"linker_set_key" : "StructMember",
"parameters" :
[
{
"referenced_type" : "_ZTIR6Struct"
}
],
"return_type" : "_ZTIv",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
}
],
"global_vars" : [],
"lvalue_reference_types" :
[
{
"alignment" : 8,
"linker_set_key" : "_ZTIR6Struct",
"name" : "Struct &",
"referenced_type" : "_ZTI6Struct",
"self_type" : "_ZTIR6Struct",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIRA_A11_i",
"name" : "int (&)[][11]",
"referenced_type" : "_ZTIA_A11_i",
"self_type" : "_ZTIRA_A11_i",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
}
],
"pointer_types" :
[
{
"alignment" : 8,
"linker_set_key" : "_ZTIPA10_A10_i",
"name" : "int (*)[10][10]",
"referenced_type" : "_ZTIA10_A10_i",
"self_type" : "_ZTIPA10_A10_i",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPA10_i",
"name" : "int (*)[10]",
"referenced_type" : "_ZTIA10_i",
"self_type" : "_ZTIPA10_i",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPA2_s",
"name" : "short (*)[2]",
"referenced_type" : "_ZTIA2_s",
"self_type" : "_ZTIPA2_s",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPPi",
"name" : "int **",
"referenced_type" : "_ZTIPi",
"self_type" : "_ZTIPPi",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
},
{
"alignment" : 8,
"linker_set_key" : "_ZTIPi",
"name" : "int *",
"referenced_type" : "_ZTIi",
"self_type" : "_ZTIPi",
"size" : 8,
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
}
],
"qualified_types" : [],
"record_types" :
[
{
"alignment" : 4,
"fields" :
[
{
"field_name" : "array",
"referenced_type" : "_ZTIA_i"
}
],
"linker_set_key" : "_ZTI6Struct",
"name" : "Struct",
"referenced_type" : "_ZTI6Struct",
"self_type" : "_ZTI6Struct",
"source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h"
}
],
"rvalue_reference_types" : []
}

View File

@@ -456,6 +456,24 @@ class HeaderCheckerTest(unittest.TestCase):
self.assertEqual(1, diff.count('function_extension_diffs'))
self.assertEqual(5, diff.count('function_diffs'))
def test_array_diff(self):
self.prepare_and_absolute_diff_all_archs("libarray", "libarray")
self.prepare_and_absolute_diff_all_archs(
"libarray_diff", "libarray_diff")
diff = self.prepare_and_run_abi_diff_all_archs(
"libarray", "libarray_diff", 8,
flags=["-input-format-new", "Json", "-input-format-old", "Json"],
create_old=False, create_new=False)
for type_id in ["StructMember", "Pointer", "DoublePointer"]:
self.assertNotIn(f'"{type_id}"', diff,
f'"{type_id}" should not be in the diff report.')
for type_id in ["Struct", "PointerToArray", "PointerTo2DArray",
"Reference", "Element"]:
self.assertIn(f'"{type_id}"', diff,
f'"{type_id}" should be in the diff report.')
if __name__ == '__main__':
unittest.main()