================
@@ -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

Reply via email to