llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Younan Zhang (zyn0217) <details> <summary>Changes</summary> In the concept parameter mapping patch, we partially preserved sugar for concept checking. However, in dependent contexts there may be non-dependent aliases that still require concept checking to filter out unwanted functions. No release note because of being a regression. Fixes https://github.com/llvm/llvm-project/issues/182344 --- Full diff: https://github.com/llvm/llvm-project/pull/183010.diff 3 Files Affected: - (modified) clang/include/clang/Sema/Template.h (+3-2) - (modified) clang/lib/Sema/SemaConcept.cpp (+1-1) - (modified) clang/test/SemaTemplate/concepts.cpp (+21) ``````````diff diff --git a/clang/include/clang/Sema/Template.h b/clang/include/clang/Sema/Template.h index b0170c21feb1a..0be46e69f1b6f 100644 --- a/clang/include/clang/Sema/Template.h +++ b/clang/include/clang/Sema/Template.h @@ -185,12 +185,13 @@ enum class TemplateSubstitutionKind : char { return !(*this)(Depth, Index).isNull(); } - bool isAnyArgInstantiationDependent() const { + bool isAnyArgInstantiationDependent(const ASTContext &C) const { for (ArgumentListLevel ListLevel : TemplateArgumentLists) for (const TemplateArgument &TA : ListLevel.Args) // There might be null template arguments representing unused template // parameter mappings in an MLTAL during concept checking. - if (!TA.isNull() && TA.isInstantiationDependent()) + if (!TA.isNull() && + C.getCanonicalTemplateArgument(TA).isInstantiationDependent()) return true; return false; } diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index 2674f0a7b8749..8cdcdbbbec14f 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -1123,7 +1123,7 @@ static bool CheckConstraintSatisfaction( return false; } - if (TemplateArgsLists.isAnyArgInstantiationDependent()) { + if (TemplateArgsLists.isAnyArgInstantiationDependent(S.Context)) { // No need to check satisfaction for dependent constraint expressions. Satisfaction.IsSatisfied = true; return false; diff --git a/clang/test/SemaTemplate/concepts.cpp b/clang/test/SemaTemplate/concepts.cpp index d93391baf9926..15d323b8f47e2 100644 --- a/clang/test/SemaTemplate/concepts.cpp +++ b/clang/test/SemaTemplate/concepts.cpp @@ -1713,3 +1713,24 @@ template<C<void, bool> T> int f(); void main() { f<int>(); } } + +namespace GH182344 { + +template <typename T> + requires true +void f() {} + +template <typename T> + requires false +void f() = delete; + +template <typename T> +struct Bar {}; + +template <typename T> using Foo = Bar<T>; + +template <typename T> void use() { + f<Foo<T>>(); +} + +} `````````` </details> https://github.com/llvm/llvm-project/pull/183010 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
