pw_span: Restrict visibility

Restrict visibility of pw_span since it is provided by pw_polyfill.

Change-Id: I268b0e5f6eb302d9fd27f3187643814b68ce7318
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/30044
Commit-Queue: Wyatt Hepler <hepler@google.com>
Reviewed-by: Ewout van Bekkum <ewout@google.com>
diff --git a/pw_polyfill/BUILD.gn b/pw_polyfill/BUILD.gn
index ff9f4db..b173e06 100644
--- a/pw_polyfill/BUILD.gn
+++ b/pw_polyfill/BUILD.gn
@@ -50,7 +50,7 @@
   remove_public_deps = [ "*" ]
   public_deps = [
     ":standard_library",
-    "$dir_pw_span",
+    "$dir_pw_span:polyfill",
   ]
   inputs = [
     "public_overrides/array",
diff --git a/pw_span/BUILD.gn b/pw_span/BUILD.gn
index bead2ef..e1c3f11 100644
--- a/pw_span/BUILD.gn
+++ b/pw_span/BUILD.gn
@@ -18,19 +18,34 @@
 import("$dir_pw_docgen/docs.gni")
 import("$dir_pw_unit_test/test.gni")
 
-config("default_config") {
-  include_dirs = [
-    "public",
-    "public_overrides",
-  ]
+config("public_config") {
+  include_dirs = [ "public" ]
+  visibility = [ ":*" ]
 }
 
+config("overrides_config") {
+  include_dirs = [ "public_overrides" ]
+  visibility = [ ":*" ]
+}
+
+# This source set provides the <span> header, which is accessed only through
+# pw_polyfill.
+pw_source_set("polyfill") {
+  remove_public_deps = [ "*" ]
+  public_configs = [ ":overrides_config" ]
+  public_deps = [ ":pw_span" ]
+  public = [ "public_overrides/span" ]
+  visibility = [ "$dir_pw_polyfill:*" ]
+}
+
+# This source set provides the internal span.h header included by <span>. This
+# source set is only used by pw_polyfill, so its visibility is restricted.
 pw_source_set("pw_span") {
   remove_public_deps = [ "*" ]
-  public_configs = [ ":default_config" ]
+  public_configs = [ ":public_config" ]
   public_deps = [ "$dir_pw_polyfill" ]
-  public = [ "public_overrides/span" ]
   sources = [ "public/pw_span/internal/span.h" ]
+  visibility = [ ":*" ]
 }
 
 pw_test_group("tests") {