@@ -297,7 +297,10 @@ private TranslatedValue translateList(CelExpr celExpr, CelAbstractSyntaxTree ast
297297 }
298298
299299 Expr <?> result = typeSystem .wrapList (listRef );
300- return TranslatedValue .propagateStrict (ctx , typeSystem , result , celExpr , elementsTv );
300+ boolean hasOptionals = !createList .optionalIndices ().isEmpty ();
301+ BoolExpr baseTaint = hasOptionals ? ctx .mkTrue () : ctx .mkFalse ();
302+ return TranslatedValue .propagateStrict (
303+ ctx , typeSystem , result , Optional .of (celExpr ), baseTaint , elementsTv );
301304 }
302305
303306 private TranslatedValue translateMap (CelExpr celExpr , CelAbstractSyntaxTree ast ) {
@@ -331,7 +334,11 @@ private TranslatedValue translateMap(CelExpr celExpr, CelAbstractSyntaxTree ast)
331334 typeConstraints .add (ctx .mkEq (typeSystem .getMapKeys (mapRef ), keysSeq ));
332335
333336 Expr <?> result = typeSystem .wrapMap (mapRef );
334- return TranslatedValue .propagateStrict (ctx , typeSystem , result , celExpr , elementsTv );
337+ boolean hasOptionals =
338+ createMap .entries ().stream ().anyMatch (CelExpr .CelMap .Entry ::optionalEntry );
339+ BoolExpr baseTaint = hasOptionals ? ctx .mkTrue () : ctx .mkFalse ();
340+ return TranslatedValue .propagateStrict (
341+ ctx , typeSystem , result , Optional .of (celExpr ), baseTaint , elementsTv );
335342 }
336343
337344 private TranslatedValue translateStruct (CelExpr celExpr , CelAbstractSyntaxTree ast ) {
@@ -396,7 +403,11 @@ private TranslatedValue translateStruct(CelExpr celExpr, CelAbstractSyntaxTree a
396403 typeConstraints .add (ctx .mkEq (typeSystem .getMsgPresence (msgRef ), msgPresence ));
397404
398405 Expr <?> result = typeSystem .wrapMessage (msgRef );
399- return TranslatedValue .propagateStrict (ctx , typeSystem , result , celExpr , elementsTv );
406+ boolean hasOptionals =
407+ createStruct .entries ().stream ().anyMatch (CelExpr .CelStruct .Entry ::optionalEntry );
408+ BoolExpr baseTaint = hasOptionals ? ctx .mkTrue () : ctx .mkFalse ();
409+ return TranslatedValue .propagateStrict (
410+ ctx , typeSystem , result , Optional .of (celExpr ), baseTaint , elementsTv );
400411 }
401412
402413 private Expr <?> getDefaultValueForType (CelType type ) {
@@ -644,6 +655,12 @@ private <T> T withScope(String varName, TranslatedValue value, Supplier<T> actio
644655 private TranslatedValue translateComprehension (CelExpr celExpr , CelAbstractSyntaxTree ast ) {
645656 CelComprehension comp = celExpr .comprehension ();
646657 CelExpr iterRangeExpr = comp .iterRange ();
658+ if (iterRangeExpr .exprKind ().getKind () == ExprKind .Kind .IDENT ) {
659+ TranslatedValue boundTv = symbolTable .get (iterRangeExpr .ident ().name ());
660+ if (boundTv != null ) {
661+ iterRangeExpr = boundTv .celExpr ().orElse (iterRangeExpr );
662+ }
663+ }
647664 List <IterationElement > iterationElements = new ArrayList <>();
648665 List <BoolExpr > taints = new ArrayList <>();
649666 List <Expr <?>> allRangeElems = new ArrayList <>();
0 commit comments