[PATCH] D115792: [Modules] Incorrect ODR detection for unresolved using type

Chuanqi Xu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 15 03:21:53 PST 2021


ChuanqiXu created this revision.
ChuanqiXu added reviewers: rsmith, aaron.ballman, urnathan, iains.
ChuanqiXu added a project: clang.
ChuanqiXu requested review of this revision.
Herald added a subscriber: cfe-commits.

See https://github.com/llvm/llvm-project/issues/52713.
This patch is a attempt to fix bug52713.

The key reason for the bug is that `isSameEntity` couldn't recognize `void bar(Ty)` in imported module and current module as the same entity. Since the compiler thinks the `Ty` type in the argument in imported module and the current are different type.

I found the reason is that the `isSameEntity` would judge if two types are the same by comparing the addressed of their canonical type. But the `Ty` type in this example is `UnresolvedUsingType` and the canonical type of `UnresolvedUsingType ` is always null. So that the compare result would be different always.

My solution in this patch is to not create a new `UnresolvedUsingType` when unserialization if there is already a canonical type in canonical declaration. I am not sure if this is proper but it runs well currently.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D115792

Files:
  clang/include/clang/AST/TypeProperties.td
  clang/test/Modules/Inputs/odr_using_dependent_name/X.cppm
  clang/test/Modules/Inputs/odr_using_dependent_name/foo.h
  clang/test/Modules/odr_using_dependent_name.cppm


Index: clang/test/Modules/odr_using_dependent_name.cppm
===================================================================
--- /dev/null
+++ clang/test/Modules/odr_using_dependent_name.cppm
@@ -0,0 +1,9 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: %clang -std=c++20 %S/Inputs/odr_using_dependent_name/X.cppm --precompile -o %t/X.pcm
+// RUN: %clang -std=c++20 -I%S/Inputs/odr_using_dependent_name -fprebuilt-module-path=%t %s --precompile -c
+// expected-no-diagnostics
+module;
+#include "foo.h"
+export module Y;
+import X;
Index: clang/test/Modules/Inputs/odr_using_dependent_name/foo.h
===================================================================
--- /dev/null
+++ clang/test/Modules/Inputs/odr_using_dependent_name/foo.h
@@ -0,0 +1,9 @@
+template <class T>
+struct bar {
+  using Ty = int;
+};
+template <class T>
+struct foo : public bar<T> {
+  using typename bar<T>::Ty;
+  void baz(Ty);
+};
Index: clang/test/Modules/Inputs/odr_using_dependent_name/X.cppm
===================================================================
--- /dev/null
+++ clang/test/Modules/Inputs/odr_using_dependent_name/X.cppm
@@ -0,0 +1,3 @@
+module;
+#include "foo.h"
+export module X;
Index: clang/include/clang/AST/TypeProperties.td
===================================================================
--- clang/include/clang/AST/TypeProperties.td
+++ clang/include/clang/AST/TypeProperties.td
@@ -358,6 +358,9 @@
   }
 
   def : Creator<[{
+    auto *Previous = cast<UnresolvedUsingTypenameDecl>(declaration)->getCanonicalDecl();
+    if (Previous && Previous->getTypeForDecl())
+      return Previous->getTypeForDecl()->getCanonicalTypeInternal();
     return ctx.getTypeDeclType(cast<UnresolvedUsingTypenameDecl>(declaration));
   }]>;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D115792.394504.patch
Type: text/x-patch
Size: 1742 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211215/fc41255f/attachment.bin>


More information about the cfe-commits mailing list