diff --git a/extern/glow b/extern/glow
index 6c99baa6ac43086a5bf94ea37898af9f19cba4fc..b749957cbf3738e6e21ce40a484d9005dbb5444f 160000
--- a/extern/glow
+++ b/extern/glow
@@ -1 +1 @@
-Subproject commit 6c99baa6ac43086a5bf94ea37898af9f19cba4fc
+Subproject commit b749957cbf3738e6e21ce40a484d9005dbb5444f
diff --git a/extern/glow-extras b/extern/glow-extras
index e8dc78bc104a0c0efbbcebd2031fc76053fc587a..d836a59ac09549fd5b3ddbd7ecfe12955a941f40 160000
--- a/extern/glow-extras
+++ b/extern/glow-extras
@@ -1 +1 @@
-Subproject commit e8dc78bc104a0c0efbbcebd2031fc76053fc587a
+Subproject commit d836a59ac09549fd5b3ddbd7ecfe12955a941f40
diff --git a/extern/polymesh b/extern/polymesh
index 2ee20575b944d16d44528653aa4ae158099493c8..65025e1af6e6abb89401e0337d49310b01ba8833 160000
--- a/extern/polymesh
+++ b/extern/polymesh
@@ -1 +1 @@
-Subproject commit 2ee20575b944d16d44528653aa4ae158099493c8
+Subproject commit 65025e1af6e6abb89401e0337d49310b01ba8833
diff --git a/extern/typed-geometry b/extern/typed-geometry
index fd57c320949e93a701e533ea436e1f4480e76350..9f74e822f4b8e3d974de0fd615ca185dd0a34e75 160000
--- a/extern/typed-geometry
+++ b/extern/typed-geometry
@@ -1 +1 @@
-Subproject commit fd57c320949e93a701e533ea436e1f4480e76350
+Subproject commit 9f74e822f4b8e3d974de0fd615ca185dd0a34e75
diff --git a/tests/ranges/span.cc b/tests/ranges/span.cc
new file mode 100644
index 0000000000000000000000000000000000000000..806ef19427daa75fca1838965965d18ea5bb41aa
--- /dev/null
+++ b/tests/ranges/span.cc
@@ -0,0 +1,22 @@
+#include <doctest.hh>
+
+#include <vector>
+
+#include <polymesh/span.hh>
+
+TEST_CASE("pm::span")
+{
+    std::vector<int> v = {1, 2, 3};
+    auto s = polymesh::span<int const>(v);
+    CHECK(s.size() == 3);
+    CHECK(s[0] == 1);
+    CHECK(s[1] == 2);
+    CHECK(s[2] == 3);
+
+    auto test = [](polymesh::span<int const> s) {
+        CHECK(s.size() == 2);
+        CHECK(s[0] == 5);
+        CHECK(s[1] == 5);
+    };
+    test(std::vector<int>(2, 5));
+}