================ @@ -2554,16 +2554,27 @@ Decl *Parser::ParseDeclarationAfterDeclarator( return ParseDeclarationAfterDeclaratorAndAttributes(D, TemplateInfo); } +static bool isConstexprVariable(const Decl *D) { + if (const VarDecl *Var = dyn_cast_if_present<VarDecl>(D)) + return Var->isConstexpr(); + + return false; +} + Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes( Declarator &D, const ParsedTemplateInfo &TemplateInfo, ForRangeInit *FRI) { // RAII type used to track whether we're inside an initializer. struct InitializerScopeRAII { Parser &P; Declarator &D; Decl *ThisDecl; + EnterExpressionEvaluationContext EC; InitializerScopeRAII(Parser &P, Declarator &D, Decl *ThisDecl) - : P(P), D(D), ThisDecl(ThisDecl) { + : P(P), D(D), ThisDecl(ThisDecl), + EC(P.Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated, + ThisDecl, Sema::ExpressionEvaluationContextRecord::EK_Other, + isConstexprVariable(ThisDecl)) { ---------------- efriedma-quic wrote:
This doesn't look right. The relevant standard text says: - "An expression or conversion is in an immediate function context if it is potentially evaluated and [...] it is a subexpression of a manifestly constant-evaluated expression or conversion [...]" - "An expression or conversion is manifestly constant-evaluated if it is [...] the initializer of a variable that is usable in constant expressions or has constant initialization" So we need to handle: - constexpr variables - variables of type `const int` - constant-initialized variables (global/static) https://github.com/llvm/llvm-project/pull/89565 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits