forked from OSchip/llvm-project
[Concepts] Add ExpressionEvaluationContexts to instantiation of constraints
Proper ExpressionEvaluationContext were not being entered when instantiating constraint expressions, which caused assertion failures in certain cases, including bug #44614.
This commit is contained in:
parent
9c2eb220ed
commit
4d33a8dfcf
|
@ -1848,6 +1848,8 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(
|
||||||
// FIXME: Concepts: Do not substitute into constraint expressions
|
// FIXME: Concepts: Do not substitute into constraint expressions
|
||||||
Expr *TrailingRequiresClause = D->getTrailingRequiresClause();
|
Expr *TrailingRequiresClause = D->getTrailingRequiresClause();
|
||||||
if (TrailingRequiresClause) {
|
if (TrailingRequiresClause) {
|
||||||
|
EnterExpressionEvaluationContext ConstantEvaluated(
|
||||||
|
SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
|
||||||
ExprResult SubstRC = SemaRef.SubstExpr(TrailingRequiresClause,
|
ExprResult SubstRC = SemaRef.SubstExpr(TrailingRequiresClause,
|
||||||
TemplateArgs);
|
TemplateArgs);
|
||||||
if (SubstRC.isInvalid())
|
if (SubstRC.isInvalid())
|
||||||
|
@ -2186,6 +2188,8 @@ Decl *TemplateDeclInstantiator::VisitCXXMethodDecl(
|
||||||
// FIXME: Concepts: Do not substitute into constraint expressions
|
// FIXME: Concepts: Do not substitute into constraint expressions
|
||||||
Expr *TrailingRequiresClause = D->getTrailingRequiresClause();
|
Expr *TrailingRequiresClause = D->getTrailingRequiresClause();
|
||||||
if (TrailingRequiresClause) {
|
if (TrailingRequiresClause) {
|
||||||
|
EnterExpressionEvaluationContext ConstantEvaluated(
|
||||||
|
SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
|
||||||
ExprResult SubstRC = SemaRef.SubstExpr(TrailingRequiresClause,
|
ExprResult SubstRC = SemaRef.SubstExpr(TrailingRequiresClause,
|
||||||
TemplateArgs);
|
TemplateArgs);
|
||||||
if (SubstRC.isInvalid())
|
if (SubstRC.isInvalid())
|
||||||
|
@ -2525,6 +2529,8 @@ Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
|
||||||
TemplateArgumentListInfo InstArgs;
|
TemplateArgumentListInfo InstArgs;
|
||||||
|
|
||||||
if (TemplArgInfo) {
|
if (TemplArgInfo) {
|
||||||
|
EnterExpressionEvaluationContext ConstantEvaluated(
|
||||||
|
SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
|
||||||
InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc);
|
InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc);
|
||||||
InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc);
|
InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc);
|
||||||
if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
|
if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
|
||||||
|
@ -3729,6 +3735,8 @@ TemplateDeclInstantiator::SubstTemplateParams(TemplateParameterList *L) {
|
||||||
// checking satisfaction.
|
// checking satisfaction.
|
||||||
Expr *InstRequiresClause = nullptr;
|
Expr *InstRequiresClause = nullptr;
|
||||||
if (Expr *E = L->getRequiresClause()) {
|
if (Expr *E = L->getRequiresClause()) {
|
||||||
|
EnterExpressionEvaluationContext ConstantEvaluated(
|
||||||
|
SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
|
||||||
ExprResult Res = SemaRef.SubstExpr(E, TemplateArgs);
|
ExprResult Res = SemaRef.SubstExpr(E, TemplateArgs);
|
||||||
if (Res.isInvalid() || !Res.isUsable()) {
|
if (Res.isInvalid() || !Res.isUsable()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -39,3 +39,15 @@ struct S {
|
||||||
};
|
};
|
||||||
|
|
||||||
static_assert(S<void>::f(1));
|
static_assert(S<void>::f(1));
|
||||||
|
|
||||||
|
constexpr auto value = 0;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct S2 {
|
||||||
|
template<typename = void> requires(value, true)
|
||||||
|
static constexpr auto f() requires(value, true) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert((S2<int>::f(), true));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue