[PATCH] D53921: Compound literals, global array decls, and enums require constant inits

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 31 13:56:30 PDT 2018


rsmith added inline comments.


================
Comment at: lib/AST/ExprConstant.cpp:5266-5268
+  bool VisitConstantExpr(const ConstantExpr *E) {
+    return Visit(E->getSubExpr());
+  }
----------------
This shouldn't be necessary because you changed the CRTP base class `ExprEvaluatorBase` to do this already.


================
Comment at: lib/AST/ExprConstant.cpp:5744-5746
+  bool VisitConstantExpr(const ConstantExpr *E) {
+    return evaluateLValue(E->getSubExpr(), Result);
+  }
----------------
Likewise here.


================
Comment at: lib/Sema/SemaDecl.cpp:16086-16094
           CheckConvertedConstantExpression(Val, EltTy, EnumVal,
                                            CCEK_Enumerator);
         if (Converted.isInvalid())
           Val = nullptr;
         else
           Val = Converted.get();
       } else if (!Val->isValueDependent() &&
----------------
I think it would make sense to create the `ConstantExpr` wrapper node in `CheckConvertedConstantExpr` / `VerifyIntegerConstantExpr`. (That's also where it'd make sense to cache the evaluated value on the wrapper node once we start doing so.)


================
Comment at: lib/Sema/SemaExpr.cpp:5752
         !literalType->isDependentType()) // C99 6.5.2.5p3
       if (CheckForConstantInitializer(LiteralExpr, literalType))
         return ExprError();
----------------
Can we create the `ConstantExpr` in here instead (assuming we need it at all)?

(The reason it's not clear to me that we need it at all is that file-scope compound literals can only appear in contexts where a constant expression is required *anyway* -- be they in array bounds, enumerators, or the initializer of a global variable.)


================
Comment at: lib/Sema/SemaExpr.cpp:5789
+                                                VK, LiteralExpr, isFileScope);
+  return MaybeBindToTemporary(new (Context) ConstantExpr(CLE));
 }
----------------
(This approach is at least not entirely correct: compound literals are only required to have a constant initializer at file scope.)


================
Comment at: lib/Sema/SemaType.cpp:2181
               !T->isConstantSizeType()) ||
              isArraySizeVLA(*this, ArraySize, ConstVal)) {
     // Even in C++11, don't allow contextual conversions in the array bound
----------------
This call calls `VerifyIntegerConstantExpression`; I think we should be creating the `ConstantExpr` node within there when appropriate.


Repository:
  rC Clang

https://reviews.llvm.org/D53921





More information about the cfe-commits mailing list