[clang] 62c221b - [Concepts] Profile TypeConstraints in ProfileTemplateParameterList

Saar Raz via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 23 00:00:25 PST 2020


Author: Saar Raz
Date: 2020-01-23T09:59:51+02:00
New Revision: 62c221b5090c2e1d3ca408bcab6f69c4d9e175b7

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

LOG: [Concepts] Profile TypeConstraints in ProfileTemplateParameterList

Profile TypeConstraints in ProfileTemplateParameterList so we can distinguish
between partial specializations which differ in their TemplateParameterList
type constraints.

Recommit, now profiling the IDC so that we can deal with situations where the
TemplateArgsAsWritten are nullptr (happens when canonicalizing type constraints).

Added: 
    

Modified: 
    clang/lib/AST/DeclTemplate.cpp
    clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp
index e750bb8b6af7..9bd3b64feb4e 100755
--- a/clang/lib/AST/DeclTemplate.cpp
+++ b/clang/lib/AST/DeclTemplate.cpp
@@ -488,7 +488,10 @@ static void ProfileTemplateParameterList(ASTContext &C,
     if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(D)) {
       ID.AddInteger(1);
       ID.AddBoolean(TTP->isParameterPack());
-      // TODO: Concepts: profile type-constraints.
+      ID.AddBoolean(TTP->hasTypeConstraint());
+      if (const TypeConstraint *TC = TTP->getTypeConstraint())
+        TC->getImmediatelyDeclaredConstraint()->Profile(ID, C,
+                                                        /*Canonical=*/true);
       continue;
     }
     const auto *TTP = cast<TemplateTemplateParmDecl>(D);

diff  --git a/clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp b/clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp
index 1ea4da29ee9f..9f3c21f99174 100644
--- a/clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp
+++ b/clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp
@@ -31,6 +31,23 @@ namespace class_templates
   // expected-note at -2{{during template argument deduction for class template partial specialization 'B<T *>' [with T = int *]}}
   // expected-note at -3{{during template argument deduction for class template partial specialization 'B<T **>' [with T = int]}}
   // expected-note at -4 2{{in instantiation of template class 'class_templates::B<int **>' requested here}}
+
+  template<typename T, typename U = double>
+  concept same_as = is_same<T, U>::value;
+
+  template<same_as<bool> T> requires A<T>::type
+  struct B<T*> {};
+  // expected-note at -1{{previous}}
+
+  template<same_as<bool> T> requires A<T>::type
+  struct B<T*> {};
+  // expected-error at -1{{redefinition}}
+
+  template<same_as T> requires A<T>::type
+  struct B<T*> {};
+
+  template<same_as<int> T> requires A<T>::type
+  struct B<T*> {};
 }
 
 namespace variable_templates


        


More information about the cfe-commits mailing list