[PATCH] D128351: [clang] missing outer template levels when checking template constraints

2022-06-22 Thread Sirui Mu via Phabricator via cfe-commits
Lancern created this revision.
Lancern added reviewers: Richard, smith.
Herald added a project: All.
Lancern requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

When checking constraint satisfaction on template arguments, the outer
template levels are not added to MultiLevelTemplateArgumentList.

Fix bugs https://github.com/llvm/llvm-project/issues/50845


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D128351

Files:
  clang/lib/Sema/SemaConcept.cpp
  clang/test/Sema/template-member-constraint.cpp


Index: clang/test/Sema/template-member-constraint.cpp
===
--- /dev/null
+++ clang/test/Sema/template-member-constraint.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify
+
+template 
+concept Foo = true;
+
+template 
+struct Bar {};
+
+template 
+struct Baz {
+  template 
+  using BazBar = Bar;
+
+  using BazBarInt = BazBar; // expected-no-diagnostics
+};
+
+template 
+struct contiguous_range {
+  template 
+requires(const_range == false)
+  using basic_iterator = int;
+
+  auto begin() {
+return basic_iterator{}; // expected-no-diagnostics
+  }
+};
Index: clang/lib/Sema/SemaConcept.cpp
===
--- clang/lib/Sema/SemaConcept.cpp
+++ clang/lib/Sema/SemaConcept.cpp
@@ -293,6 +293,7 @@
 
   MultiLevelTemplateArgumentList MLTAL;
   MLTAL.addOuterTemplateArguments(TemplateArgs);
+  MLTAL.addOuterRetainedLevels(Template->getTemplateDepth());
 
   for (const Expr *ConstraintExpr : ConstraintExprs) {
 if (calculateConstraintSatisfaction(S, Template, TemplateArgs,


Index: clang/test/Sema/template-member-constraint.cpp
===
--- /dev/null
+++ clang/test/Sema/template-member-constraint.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify
+
+template 
+concept Foo = true;
+
+template 
+struct Bar {};
+
+template 
+struct Baz {
+  template 
+  using BazBar = Bar;
+
+  using BazBarInt = BazBar; // expected-no-diagnostics
+};
+
+template 
+struct contiguous_range {
+  template 
+requires(const_range == false)
+  using basic_iterator = int;
+
+  auto begin() {
+return basic_iterator{}; // expected-no-diagnostics
+  }
+};
Index: clang/lib/Sema/SemaConcept.cpp
===
--- clang/lib/Sema/SemaConcept.cpp
+++ clang/lib/Sema/SemaConcept.cpp
@@ -293,6 +293,7 @@
 
   MultiLevelTemplateArgumentList MLTAL;
   MLTAL.addOuterTemplateArguments(TemplateArgs);
+  MLTAL.addOuterRetainedLevels(Template->getTemplateDepth());
 
   for (const Expr *ConstraintExpr : ConstraintExprs) {
 if (calculateConstraintSatisfaction(S, Template, TemplateArgs,
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D128351: [clang] missing outer template levels when checking template constraints

2022-06-22 Thread Sirui Mu via Phabricator via cfe-commits
Lancern updated this revision to Diff 439253.
Lancern added a comment.

Fix some regression issues


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D128351/new/

https://reviews.llvm.org/D128351

Files:
  clang/lib/Sema/SemaConcept.cpp
  clang/test/SemaCXX/template-member-alias-constraint.cpp


Index: clang/test/SemaCXX/template-member-alias-constraint.cpp
===
--- /dev/null
+++ clang/test/SemaCXX/template-member-alias-constraint.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify
+
+template 
+concept Foo = true;
+
+template 
+struct Bar {};
+
+template 
+struct Baz {
+  template 
+  using BazBar = Bar;
+
+  using BazBarInt = BazBar; // expected-no-diagnostics
+};
+
+template 
+struct contiguous_range {
+  template 
+requires(const_range == false)
+  using basic_iterator = int;
+
+  auto begin() {
+return basic_iterator{}; // expected-no-diagnostics
+  }
+};
Index: clang/lib/Sema/SemaConcept.cpp
===
--- clang/lib/Sema/SemaConcept.cpp
+++ clang/lib/Sema/SemaConcept.cpp
@@ -293,6 +293,10 @@
 
   MultiLevelTemplateArgumentList MLTAL;
   MLTAL.addOuterTemplateArguments(TemplateArgs);
+  if (const TypeAliasTemplateDecl *AliasTemplate =
+  dyn_cast_or_null(Template)) {
+MLTAL.addOuterRetainedLevels(AliasTemplate->getTemplateDepth());
+  }
 
   for (const Expr *ConstraintExpr : ConstraintExprs) {
 if (calculateConstraintSatisfaction(S, Template, TemplateArgs,


Index: clang/test/SemaCXX/template-member-alias-constraint.cpp
===
--- /dev/null
+++ clang/test/SemaCXX/template-member-alias-constraint.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify
+
+template 
+concept Foo = true;
+
+template 
+struct Bar {};
+
+template 
+struct Baz {
+  template 
+  using BazBar = Bar;
+
+  using BazBarInt = BazBar; // expected-no-diagnostics
+};
+
+template 
+struct contiguous_range {
+  template 
+requires(const_range == false)
+  using basic_iterator = int;
+
+  auto begin() {
+return basic_iterator{}; // expected-no-diagnostics
+  }
+};
Index: clang/lib/Sema/SemaConcept.cpp
===
--- clang/lib/Sema/SemaConcept.cpp
+++ clang/lib/Sema/SemaConcept.cpp
@@ -293,6 +293,10 @@
 
   MultiLevelTemplateArgumentList MLTAL;
   MLTAL.addOuterTemplateArguments(TemplateArgs);
+  if (const TypeAliasTemplateDecl *AliasTemplate =
+  dyn_cast_or_null(Template)) {
+MLTAL.addOuterRetainedLevels(AliasTemplate->getTemplateDepth());
+  }
 
   for (const Expr *ConstraintExpr : ConstraintExprs) {
 if (calculateConstraintSatisfaction(S, Template, TemplateArgs,
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits