hazohelet added a comment. In D151033#4359121 <https://reviews.llvm.org/D151033#4359121>, @tbaeder wrote:
> Can you briefly explain why the `FieldDecl` we see is null in that case? Consider `template<typename T> constexpr T foo{};` `evaluateValue` here leads to a call of `EvaluateAsInitializer`. It calls `CheckConstantExpression`, which leads to the call of `CheckEvaluationResult` with null `FieldDecl`. The `APValue`-typed `Value` argument passed to `CheckConstantExpression` should `hasValue` bacause otherwise it would cause assertion failure we saw before. This `Value` object is calculated at `Evaluate` function called from `EvaluateAsInitializer`. The evaluated `Expr` object is `InitListExpr` that has type `void`, so the branch for `void`-typed expression(https://github.com/llvm/llvm-project/blob/8b1727f8d9104df5ced4bdfdc065dea85ff84baf/clang/lib/AST/ExprConstant.cpp#L15041-L15046) is fired. In this branch, the `Result` argument is left untouched, which leads to `CheckEvaluationResult` receiving `Value` object whose `hasValue` evaluates to `false`. BTW, I noticed that when the type of the declaration is NOT a dependent type (e.g. `template <typename T> constexpr int foo{42}` ), we need to evaluate the initializer and dump the value. I'll update the patch and retitle it. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D151033/new/ https://reviews.llvm.org/D151033 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits