Merge "header-checker: Fix opaque types comparison"
am: d199d5d3a0

Change-Id: Icacd0f84ca73692a002160b80f527d24f485ea56
diff --git a/vndk/tools/header-checker/header-abi-util/src/abi_diff_helpers.cpp b/vndk/tools/header-checker/header-abi-util/src/abi_diff_helpers.cpp
index bf01ab3..2518825 100644
--- a/vndk/tools/header-checker/header-abi-util/src/abi_diff_helpers.cpp
+++ b/vndk/tools/header-checker/header-abi-util/src/abi_diff_helpers.cpp
@@ -810,6 +810,7 @@
       old_types_.find(old_type_id);
   AbiElementMap<const abi_util::TypeIR *>::const_iterator new_it =
       new_types_.find(new_type_id);
+
   if (old_it == old_types_.end() || new_it == new_types_.end()) {
     TypeQueueCheckAndPop(type_queue);
     // One of the types were hidden, we cannot compare further.
@@ -830,11 +831,16 @@
   }
 
   TypeQueueCheckAndPop(type_queue);
+
   if (diff_policy_options_.consider_opaque_types_different_ &&
-      diff_status == DiffStatus::opaque_diff &&
-      (old_it->second->GetName() != new_it->second->GetName())) {
-    return DiffStatus::direct_diff;
+      diff_status == DiffStatus::opaque_diff) {
+    // If `-considered-opaque-types-different` is specified and the comparison
+    // of `referenced_type` results in `opaque_diff`, then check the type name
+    // at this level.
+    return (old_it->second->GetName() == new_it->second->GetName() ?
+            DiffStatus::no_diff : DiffStatus::direct_diff);
   }
+
   return diff_status;
 }
 
diff --git a/vndk/tools/header-checker/tests/abi_dumps/opaque_ptr_types.lsdump b/vndk/tools/header-checker/tests/abi_dumps/opaque_ptr_types.lsdump
new file mode 100644
index 0000000..2ecd7c3
--- /dev/null
+++ b/vndk/tools/header-checker/tests/abi_dumps/opaque_ptr_types.lsdump
@@ -0,0 +1,29 @@
+{
+ "elf_objects" :
+ [
+  {
+   "name" : "test"
+  }
+ ],
+ "global_vars" :
+ [
+  {
+   "linker_set_key" : "test",
+   "name" : "test",
+   "referenced_type" : "type-1",
+   "source_file" : "opaque_ptr_types.h"
+  }
+ ],
+ "pointer_types" :
+ [
+  {
+   "alignment" : 8,
+   "linker_set_key" : "OpaqueType *",
+   "name" : "OpaqueType *",
+   "referenced_type" : "type-2",
+   "self_type" : "type-1",
+   "size" : 8,
+   "source_file" : "opaque_ptr_types.h"
+  }
+ ]
+}
diff --git a/vndk/tools/header-checker/tests/test.py b/vndk/tools/header-checker/tests/test.py
index eea3ff1..da0fc6c 100755
--- a/vndk/tools/header-checker/tests/test.py
+++ b/vndk/tools/header-checker/tests/test.py
@@ -277,6 +277,14 @@
             ["-input-format-old", "ProtobufTextFormat",
              "-input-format-new", "Json"])
 
+    def test_opaque_type_self_diff(self):
+        lsdump = os.path.join(
+            SCRIPT_DIR, "abi_dumps", "opaque_ptr_types.lsdump")
+        self.run_and_compare_abi_diff(
+            lsdump, lsdump, "libexample", "arm64", 0,
+            ["-input-format-old", "Json", "-input-format-new", "Json",
+             "-consider-opaque-types-different"])
+
 
 if __name__ == '__main__':
     unittest.main()