sepavloff added a comment.

Thank you for feedback!

In D103395#3096177 <https://reviews.llvm.org/D103395#3096177>, @tambre wrote:

> This breaks the following code:
>
>   struct sub
>   {
>       char data;
>   };
>   
>   struct main
>   {
>       constexpr main()
>       {
>               member = {};
>       }
>   
>       sub member;
>   };
>   
>   constexpr main a{};
>
> With:
>
>   fmt.cpp:16:16: error: constexpr variable 'a' must be initialized by a 
> constant expression
>   constexpr main a{};
>                  ^~~
>   1 error generated.
>
> Clang trunk and GCC (Debian 11.2.0-10) handle it fine.
> Noticed in libfmt 
> <https://github.com/fmtlib/fmt/issues/2571#issuecomment-953887675>.

Strange, I see that it cannot be compiled neither by gcc nor by clang: 
https://godbolt.org/z/1dY9Gs6zM. Do I miss something?



================
Comment at: clang/lib/AST/ExprConstant.cpp:1584-1585
       Designator = SubobjectDesignator(getType(B));
+      if (!LExpr)
+        LExpr = B.dyn_cast<const Expr *>();
       IsNullPtr = false;
----------------
aaron.ballman wrote:
> Should we be asserting that `LExpr` is null?
`LExpr` is initialized only once, when LValue starts evaluation. Later on the 
evaluation can proceed to subexpressions but the upper expression is sufficient 
to detect active union member change.


================
Comment at: clang/lib/AST/ExprConstant.cpp:8049
 
+  bool evaluate(const Expr *E) {
+    Result.LExpr = E;
----------------
aaron.ballman wrote:
> It's not super clear to me when consumers should call `Evaluate()` instead of 
> calling `Visit()`. Some comments on the function may help make it more clear.
`Visit` methods are now made non-public, hopefully it can make usage more clear.


================
Comment at: clang/lib/AST/ExprConstant.cpp:8050
+  bool evaluate(const Expr *E) {
+    Result.LExpr = E;
+    return Visit(E);
----------------
aaron.ballman wrote:
> Should we be asserting that `Result.LExpr` is not already set?
`Result.LExpr` is updated while evaluator descend the evaluated tree, so it is 
normal to see it set. 


================
Comment at: clang/lib/AST/ExprConstant.cpp:8586
 
+  bool evaluate(const Expr *E) { return Visit(E); }
+
----------------
aaron.ballman wrote:
> Is there a reason we're not setting `Result.LExpr` here?
Actually This method was used in the initial implementation, now it can be 
removed.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D103395

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

Reply via email to