[clang] [Clang] Fixed an assertion in constant evaluation of EmbedExpr inside array initializers. (PR #182257)

Eli Friedman via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 20 16:10:36 PST 2026


================
@@ -14770,15 +14770,16 @@ bool ArrayExprEvaluator::VisitCXXParenListOrInitListExpr(
         Value = SL->getCodeUnit(I);
         if (DestTy->isIntegerType()) {
           Result.getArrayInitializedElt(ArrayIndex) = APValue(Value);
-        } else {
-          assert(DestTy->isFloatingType() && "unexpected type");
+        } else if (DestTy->isRealFloatingType()) {
           const FPOptions FPO =
               Init->getFPFeaturesInEffect(Info.Ctx.getLangOpts());
           APFloat FValue(0.0);
           if (!HandleIntToFloatCast(Info, Init, FPO, EmbedS->getType(), Value,
                                     DestTy, FValue))
             return false;
           Result.getArrayInitializedElt(ArrayIndex) = APValue(FValue);
+        } else {
+          return false;
----------------
efriedma-quic wrote:

An `#embed` is formally, according to the standard, purely a preprocessor construct: it just produces a sequence of comma-separated integers.  As an optimization, we don't actually represent it this way in init lists: we optimize it to an EmbedExpr.  And then when SemaInit analyzes the initialization, it decides whether to keep it as a single array, or separate it out into individual elements.  If it's simple, it keeps a single array; if it's too complicated to analyze, it splits the EmbedExpr into multiple EmbedExprs for each field.  For example, the following gets split:

```
struct S { int x,y;};
struct S s[] = {
#embed "/tmp/z"
};
```

-----

 InitListChecker::CheckArrayType chooses whether to keep an EmbedExpr intact, or split it.  My suggestion is that we should split more aggressively.  Keeping EmbedExprs intact is just a performance optimization, and we should only care about preserving that performance optimization if the user is doing something reasonable.  We don't care about the performance of initializing an array of pointers with `#embed`.

https://github.com/llvm/llvm-project/pull/182257


More information about the cfe-commits mailing list