llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: babadany2999 <details> <summary>Changes</summary> ### Summary Fixed an assertion crash when instantiating a nested requirement with an invalid constraint. Fixes #<!-- -->213575 ### Details In `clang/lib/Sema/SemaTemplateInstantiate.cpp`, inside the method `TransformNestedRequirement`, the check for `concepts::NestedRequirement*` (more explicitly, `if (Req->hasInvalidConstraint())`) was being executed too late, as `Req->getConstraintExpr` has already been executed, which contained the assertion. ### Test Plan - Added regression test to `clang/test/SemaTemplate/gh213575.cpp` - Verified test fails without the patch and passes with the patch across `clang/test/SemaTemplate`, `clang/test/SemaCXX` and `clang/test/Sema` cc @<!-- -->cor3ntin - I've noticed your recent refactoring in `TransformNestedRequirement` (`e9972de`) introduced this ordering issue. Whenever you have a moment, I'd appreciate your review on this fix! --- Full diff: https://github.com/llvm/llvm-project/pull/213660.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.md (+1) - (modified) clang/lib/Sema/SemaTemplateInstantiate.cpp (+7-7) - (added) clang/test/SemaTemplate/gh213575.cpp (+15) ``````````diff diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index a38b99ff8e075..fac0526ae42da 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -365,6 +365,7 @@ features cannot lower the translation-unit ABI level; - Fixed a bug where `__func__`, `__PRETTY_FUNCTION__` and `__FUNCTION__` were not resolving to the proper function when inside a lambda return type (#GH211811) - Fixed USR generation for declarations whose signature mentions a class-type non-type template parameter. (#GH212351) +- Fixed an assertion crash when instantiating a nested requirement with an invalid constraint. (#GH213575) #### Bug Fixes to Compiler Builtins diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 2cf2a4f85f830..1ebb92e5d06d6 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -2832,6 +2832,13 @@ TemplateInstantiator::TransformNestedRequirement( ASTContext &C = SemaRef.Context; + if (Req->hasInvalidConstraint()) { + if (AlwaysRebuild()) + return RebuildNestedRequirement(Req->getInvalidConstraintEntity(), + Req->getConstraintSatisfaction()); + return Req; + } + Expr *Constraint = Req->getConstraintExpr(); ConstraintSatisfaction Satisfaction; @@ -2845,13 +2852,6 @@ TemplateInstantiator::TransformNestedRequirement( SemaRef.Context, C.backupStr(Entity), std::move(Satisfaction)); }; - if (Req->hasInvalidConstraint()) { - if (AlwaysRebuild()) - return RebuildNestedRequirement(Req->getInvalidConstraintEntity(), - Req->getConstraintSatisfaction()); - return Req; - } - if (!getEvaluateConstraints()) { ExprResult TransConstraint = TransformExpr(Req->getConstraintExpr()); if (TransConstraint.isInvalid() || !TransConstraint.get()) diff --git a/clang/test/SemaTemplate/gh213575.cpp b/clang/test/SemaTemplate/gh213575.cpp new file mode 100644 index 0000000000000..963d518f9fe65 --- /dev/null +++ b/clang/test/SemaTemplate/gh213575.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s + +struct S {}; +template <typename T> bar C; // expected-error {{unknown type name 'bar'}} + +template <typename U> auto foo() { + return []<typename T>( + T, bool b = requires { C<T>; }) { + static_assert(requires { requires C<U>; }); // expected-error {{static assertion failed due to requirement 'requires { requires <<error-expression>>; }'}} + return 0; + }; +} + +auto baz = foo<int>(); +int qux = baz(S{}); // expected-note {{in instantiation of function template specialization 'foo()::(lambda)::operator()<S>' requested here}} \ No newline at end of file `````````` </details> https://github.com/llvm/llvm-project/pull/213660 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
