diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java index a9b15a0b49efd6..e688bd85e2c262 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java @@ -604,6 +604,10 @@ public ConfiguredAspect createAspect( ruleClassProvider.getToolsRepository()); if (configuredAspect == null) { return erroredConfiguredAspect(ruleContext, null); + } else if (configuredAspect.get(AnalysisFailureInfo.STARLARK_CONSTRUCTOR) != null) { + // this was created by #erroredConfiguredAspect, return early to skip validating advertised + // providers + return configuredAspect; } validateAdvertisedProviders( diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisFailureInfoTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisFailureInfoTest.java index 4de52c379e561a..4b30da9aaf3a64 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisFailureInfoTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisFailureInfoTest.java @@ -410,4 +410,39 @@ public void starlarkAspectAndRuleFailure_analysisFailureInfoPropagatesOnlyFromRu .comparingElementsUsing(analysisFailureCorrespondence) .containsExactly(expectedRuleFailure); } + + @Test + public void starlarkAspectWithAdvertisedProvidersFailure_analysisFailurePropagates() + throws Exception { + scratch.file( + "test/extension.bzl", + "MyInfo = provider()", + "", + "def custom_aspect_impl(target, ctx):", + " fail('Aspect Failure')", + "", + "custom_aspect = aspect(implementation = custom_aspect_impl, provides = [MyInfo])", + "", + "def custom_rule_impl(ctx):", + " pass", + "", + "custom_rule = rule(implementation = custom_rule_impl,", + " attrs = {'deps' : attr.label_list(aspects = [custom_aspect])})"); + scratch.file( + "test/BUILD", + "load('//test:extension.bzl', 'custom_rule')", + "", + "custom_rule(name = 'one')", + "custom_rule(name = 'two', deps = [':one'])"); + + ConfiguredTarget target = getConfiguredTarget("//test:two"); + AnalysisFailureInfo info = + (AnalysisFailureInfo) target.get(AnalysisFailureInfo.STARLARK_CONSTRUCTOR.getKey()); + AnalysisFailure expectedRuleFailure = + new AnalysisFailure(Label.parseCanonicalUnchecked("//test:one"), "Aspect Failure"); + + assertThat(info.getCausesNestedSet().toList()) + .comparingElementsUsing(analysisFailureCorrespondence) + .containsExactly(expectedRuleFailure); + } }