Catch action conflicts in the same target during configured target analysis, and fail hard in other cases.

--
MOS_MIGRATED_REVID=89720528
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 8b1b1bc..563174d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -16,10 +16,13 @@
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.ListMultimap;
+import com.google.devtools.build.lib.actions.Action;
+import com.google.devtools.build.lib.actions.Actions;
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.analysis.Aspect;
 import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment;
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
@@ -494,8 +497,27 @@
     analysisEnvironment.disable(target);
     Preconditions.checkNotNull(configuredTarget, target);
 
-    return new ConfiguredTargetValue(configuredTarget,
-        ImmutableList.copyOf(analysisEnvironment.getRegisteredActions()));
+    try {
+      return new ConfiguredTargetValue(configuredTarget,
+          filterSharedActionsAndThrowIfConflict(analysisEnvironment.getRegisteredActions()));
+    } catch (ActionConflictException e) {
+      throw new ConfiguredTargetFunctionException(e);
+    }
+  }
+
+  static Map<Artifact, Action> filterSharedActionsAndThrowIfConflict(Iterable<Action> actions)
+      throws ActionConflictException {
+    Map<Artifact, Action> generatingActions = new HashMap<>();
+    for (Action action : actions) {
+      for (Artifact artifact : action.getOutputs()) {
+        Action previousAction = generatingActions.put(artifact, action);
+        if (previousAction != null && previousAction != action
+            && !Actions.canBeShared(previousAction, action)) {
+          throw new ActionConflictException(artifact, previousAction, action);
+        }
+      }
+    }
+    return generatingActions;
   }
 
   /**
@@ -522,6 +544,10 @@
       super(error, Transience.PERSISTENT);
     };
 
+    private ConfiguredTargetFunctionException(ActionConflictException e) {
+      super(e, Transience.PERSISTENT);
+    }
+
     private ConfiguredTargetFunctionException(
         @Nullable SkyKey childKey, Exception transitiveError) {
       super(transitiveError, childKey);