[clang] f4dd977 - [AST] Use canonical constraint declaration for ASTContext::getAutoType

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 4 02:43:29 PDT 2022


Author: Chuanqi Xu
Date: 2022-07-04T17:38:05+08:00
New Revision: f4dd977537dc0fcd8605a1ce066a4c7fd271a5d7

URL: https://github.com/llvm/llvm-project/commit/f4dd977537dc0fcd8605a1ce066a4c7fd271a5d7
DIFF: https://github.com/llvm/llvm-project/commit/f4dd977537dc0fcd8605a1ce066a4c7fd271a5d7.diff

LOG: [AST] Use canonical constraint declaration for ASTContext::getAutoType

When we do profiling in ASTContext::getAutoType, it wouldn't think about
the canonical declaration for the type constraint. It is bad since it
would cause a negative ODR mismatch while we already know the type
constraint declaration is a redeclaration for the previous one. Also it shouldn't be
bad to use the canonical declaration here.

Added: 
    

Modified: 
    clang/lib/AST/ASTContext.cpp
    clang/test/Modules/concept.cppm

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 682b71a3d6865..e64135cbf3f4e 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -5707,6 +5707,9 @@ QualType ASTContext::getAutoTypeInternal(
       !TypeConstraintConcept && !IsDependent)
     return getAutoDeductType();
 
+  if (TypeConstraintConcept)
+    TypeConstraintConcept = TypeConstraintConcept->getCanonicalDecl();
+
   // Look in the folding set for an existing type.
   void *InsertPos = nullptr;
   llvm::FoldingSetNodeID ID;

diff  --git a/clang/test/Modules/concept.cppm b/clang/test/Modules/concept.cppm
index f171e6d082374..84bc0fef83926 100644
--- a/clang/test/Modules/concept.cppm
+++ b/clang/test/Modules/concept.cppm
@@ -1,10 +1,54 @@
 // RUN: rm -rf %t
 // RUN: mkdir %t
-// RUN: %clang_cc1 -x c++ -std=c++20 %S/Inputs/concept/A.cppm -emit-module-interface -o %t/A.pcm
-// RUN: %clang_cc1 -x c++ -std=c++20 -fprebuilt-module-path=%t -I%S/Inputs/concept %s -fsyntax-only -verify
-// expected-no-diagnostics
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -o %t/A.pcm
+// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t -I%t %t/B.cppm -verify
+
+//--- foo.h
+#ifndef FOO_H
+#define FOO_H
+
+template <class T>
+concept Range = requires(T &t) { t.begin(); };
+
+template<class _Tp>
+concept __integer_like = true;
+
+template <class _Tp>
+concept __member_size = requires(_Tp &&t) { t.size(); };
+
+struct A {
+public:
+  template <Range T>
+  using range_type = T;
+};
 
+struct __fn {
+  template <__member_size _Tp>
+  constexpr __integer_like auto operator()(_Tp&& __t) const {
+    return __t.size();
+  }
+};
+#endif
+
+//--- A.cppm
+module;
+#include "foo.h"
+export module A;
+
+//--- B.cppm
+// expected-no-diagnostics
 module;
 #include "foo.h"
 export module B;
 import A;
+
+void foo() {
+    A a;
+    struct S {
+        int size() { return 0; }
+        auto operator+(S s) { return 0; }
+    };
+    __fn{}(S());
+}


        


More information about the cfe-commits mailing list