efriedma added a comment.

I would like to kill off all the code you're modifying, and let ExprConstant be 
the final arbiter of whether a constant is in fact constant.  But that's 
probably a larger project than you really want to mess with.  The big missing 
piece of that is that we currently don't allow ExprConstant to evaluate 
structs/arrays in C, for the sake of compile-time performance. (Not sure what 
the performance impact for large arrays looks like at the moment.)



================
Comment at: clang/lib/AST/Expr.cpp:3164
+      const QualType &QT = cast<DeclRefExpr>(this)->getDecl()->getType();
+      if (QT->isStructureType() && QT.isConstQualified())
+        return true;
----------------
nickdesaulniers wrote:
> nickdesaulniers wrote:
> > Interesting, playing with this more in godbolt, it looks like the struct 
> > doesn't even have to be const qualified.
> Or, rather, behaves differently between C and C++ mode;
> 
> C -> const required
> C++ -> const not required
In C++, global variable initializers don't have to be constant expressions at 
all.

Do we really need to check GNUMode here? We try to avoid it except for cases 
where we would otherwise reject valid code.

Do we need to worry about arrays here?


================
Comment at: clang/lib/CodeGen/CGExprConstant.cpp:1013
+      if (V->hasInit())
+        return Visit(V->getInit(), V->getType());
+    return nullptr;
----------------
You need to be more careful here; we can call ConstExprEmitter for arbitrary 
expressions.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76096



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

Reply via email to