rsmith added a comment.

In D62009#1506415 <https://reviews.llvm.org/D62009#1506415>, @Tyker wrote:

> there are issues with using ConstantExpr to mark expressions as constant for 
> semantic checking:
>
> - #1 multpile Expr::Ignore* operation remove ConstantExpr from the expression.


`Ignore*` is generally used when walking the syntactic form of an expression, 
so this is usually appropriate.

> - #2 Semantic checking Traverses the AST so all methods that only mark the 
> top-level Node will not completely work.

Semantic checks that care about constant evaluation should not walk over a 
`ConstantExpr` node. Generally, we want rather different checking inside a 
`ConstantExpr` node than outside (for example, we shouldn't be performing any 
checks for potential overflow or narrowing or conversions, and instead should 
be finding out what *actually* happens by evaluating the expression and 
diagnosing problems in it). So this seems fine too, though there may still be 
places that need updates to properly handle `ConstantExpr`.

> - #3 at short term: adding ConstantExpr modifies the AST structure, so adding 
> it everywhere it is needed for semantic checking will require changing code 
> that depend closely on the AST structure.

Yes. But that's going to be the case for any approach we take here.

> - push a ExpressionEvaluationContext::ConstantEvaluated so Sema will 
> propagate it and propagate from Sema to the expression evaluator via boolean 
> values.
> - put all semantic checking function's in a SemaCheckContext class and 
> propagate via this class to the expression evaluator. this class will be 
> usable to propagate Sema and probably other informations.
> - keep the bit in ExprBitfield but make all nodes created in 
> ExpressionEvaluationContext::ConstantEvaluated marked for constant evaluation 
> to fixes limitation #2.

We don't always know whether an expression is constant evaluated until after 
we've parsed it (eg, for a call to a function that might be `consteval` we need 
to perform overload resolution before we find out). And this would require 
changing all the (many) places that create `Expr` nodes to pass in new 
information. That sounds unpleasant and expensive, and adds a permanent cost to 
all future AST changes.

So far we don't appear to need any per-`Expr` indicator of whether that 
expression is transitively within a `ConstantExpr`, so let's not add that.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62009/new/

https://reviews.llvm.org/D62009



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to