Allow strings as default values of labels

Strings now can be passed to the default parameter of attr.label,
attr.label_list, and attr.label_keyed_string_dict.

PiperOrigin-RevId: 160896987
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 50c4775..aef0e11 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -430,6 +430,7 @@
         .add(Attribute.attr("tags", Type.STRING_LIST))
         .build();
   }
+
   @Test
   public void testAttrAllowedRuleClassesSpecificRuleClasses() throws Exception {
     Attribute attr = buildAttribute("a",
@@ -437,6 +438,7 @@
     assertThat(attr.getAllowedRuleClassesPredicate().apply(ruleClass("java_binary"))).isTrue();
     assertThat(attr.getAllowedRuleClassesPredicate().apply(ruleClass("genrule"))).isFalse();
   }
+
   @Test
   public void testAttrDefaultValue() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.string(default = 'some value')");
@@ -444,6 +446,42 @@
   }
 
   @Test
+  public void testLabelAttrDefaultValueAsString() throws Exception {
+    Attribute sligleAttr = buildAttribute("a1", "attr.label(default = '//foo:bar')");
+    assertThat(sligleAttr.getDefaultValueForTesting())
+        .isEqualTo(Label.parseAbsolute("//foo:bar", false));
+
+    Attribute listAttr =
+        buildAttribute("a2", "attr.label_list(default = ['//foo:bar', '//bar:foo'])");
+    assertThat(listAttr.getDefaultValueForTesting())
+        .isEqualTo(
+            ImmutableList.of(
+                Label.parseAbsolute("//foo:bar", false), Label.parseAbsolute("//bar:foo", false)));
+
+    Attribute dictAttr =
+        buildAttribute("a3", "attr.label_keyed_string_dict(default = {'//foo:bar': 'my value'})");
+    assertThat(dictAttr.getDefaultValueForTesting())
+        .isEqualTo(ImmutableMap.of(Label.parseAbsolute("//foo:bar", false), "my value"));
+  }
+
+  @Test
+  public void testLabelAttrDefaultValueAsStringBadValue() throws Exception {
+    checkErrorContains(
+        "invalid label '/foo:bar' in parameter 'default' of attribute 'label': "
+            + "invalid label: /foo:bar",
+        "attr.label(default = '/foo:bar')");
+
+    checkErrorContains(
+        "invalid label '/bar:foo' in element 1 of parameter 'default' of attribute "
+            + "'label_list': invalid label: /bar:foo",
+        "attr.label_list(default = ['//foo:bar', '/bar:foo'])");
+
+    checkErrorContains(
+        "invalid label '/bar:foo' in dict key element: invalid label: /bar:foo",
+        "attr.label_keyed_string_dict(default = {'//foo:bar': 'a', '/bar:foo': 'b'})");
+  }
+
+  @Test
   public void testAttrDefaultValueBadType() throws Exception {
     checkErrorContains(
         "method attr.string(*, default: string, mandatory: bool, values: sequence of strings) "
@@ -819,9 +857,9 @@
   @Test
   public void testLabelAttrWrongDefault() throws Exception {
     checkErrorContains(
-        "expected Label or Label-returning function or NoneType for 'default' "
-            + "while calling label but got string instead: //foo:bar",
-        "attr.label(default = '//foo:bar')");
+        "expected value of type 'string' for parameter 'default' of attribute 'label', "
+            + "but got 123 (int)",
+        "attr.label(default = 123)");
   }
 
   @Test