Accept expansion flags expanding to expansion flags in invocation policy.

Fix bug where a null value in the expansion text lead to a NullPointerException.

RELNOTES: None.
PiperOrigin-RevId: 164061496
diff --git a/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java b/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
index 562221d..9d8c13a 100644
--- a/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
+++ b/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
@@ -349,7 +349,7 @@
         repeatableSubflagsInSetValues.put(currentSubflag.getName(), currentSubflag);
       } else {
         FlagPolicy subflagAsPolicy =
-            getSubflagAsPolicy(currentSubflag, originalPolicy, isExpansion);
+            getSingleValueSubflagAsPolicy(currentSubflag, originalPolicy, isExpansion);
         // In case any of the expanded flags are themselves expansions, recurse.
         expandedPolicies.addAll(expandPolicy(subflagAsPolicy, parser));
       }
@@ -425,19 +425,28 @@
    * For an expansion flag in an invocation policy, each flag it expands to must be given a
    * corresponding policy.
    */
-  private static FlagPolicy getSubflagAsPolicy(
+  private static FlagPolicy getSingleValueSubflagAsPolicy(
       OptionValueDescription currentSubflag, FlagPolicy originalPolicy, boolean isExpansion)
       throws OptionsParsingException {
     FlagPolicy subflagAsPolicy = null;
     switch (originalPolicy.getOperationCase()) {
       case SET_VALUE:
-        assert (!currentSubflag.getAllowMultiple());
+        if (currentSubflag.getAllowMultiple()) {
+          throw new AssertionError(
+              "SetValue subflags with allowMultiple should have been dealt with separately and "
+                  + "accumulated into a single FlagPolicy.");
+        }
+        // Accept null originalValueStrings, they are expected when the subflag is also an expansion
+        // flag.
+        List<String> subflagValue;
+        if (currentSubflag.getOriginalValueString() == null) {
+          subflagValue = ImmutableList.of();
+        } else {
+          subflagValue = ImmutableList.of(currentSubflag.getOriginalValueString());
+        }
         subflagAsPolicy =
             getSetValueSubflagAsPolicy(
-                currentSubflag.getName(),
-                ImmutableList.of(currentSubflag.getOriginalValueString()),
-                /*allowMultiple=*/ false,
-                originalPolicy);
+                currentSubflag.getName(), subflagValue, /*allowMultiple=*/ false, originalPolicy);
         break;
 
       case USE_DEFAULT: