diff --git a/arbor/morph/label_parse.cpp b/arbor/morph/label_parse.cpp
index 86edaadf19cd556745bc257fd6ec2519d339d598..a40bb160a89fe698260cb44d3d96f9d0a175a91c 100644
--- a/arbor/morph/label_parse.cpp
+++ b/arbor/morph/label_parse.cpp
@@ -246,6 +246,8 @@ std::unordered_multimap<std::string, evaluator> eval_map {
                             "'uniform' with 4 arguments: (reg:region, first:int, last:int, seed:int)")},
     {"on-branches",make_call<double>(arb::ls::on_branches,
                             "'on-branches' with 1 argument: (pos:double)")},
+    {"on-components",make_call<double, arb::region>(arb::ls::on_components,
+                            "'on-components' with 2 arguments: (pos:double, reg:region)")},
     {"locset",  make_call<std::string>(arb::ls::named,
                             "'locset' with 1 argument: (name:string)")},
     {"restrict",  make_call<arb::locset, arb::region>(arb::ls::restrict,
diff --git a/arbor/morph/locset.cpp b/arbor/morph/locset.cpp
index 17a27addb585c5a3a1f54becaaddbd806490bf27..2fc140e5ea223187e9656fb60b9b2f1b38e9e753 100644
--- a/arbor/morph/locset.cpp
+++ b/arbor/morph/locset.cpp
@@ -392,7 +392,7 @@ mlocation_list thingify_(const on_components_& n, const mprovider& p) {
 }
 
 std::ostream& operator<<(std::ostream& o, const on_components_& x) {
-    return o << "(on_components " << x.relpos << " " << x.reg << ")";
+    return o << "(on-components " << x.relpos << " " << x.reg << ")";
 }
 
 // Uniform locset.
diff --git a/test/unit/test_s_expr.cpp b/test/unit/test_s_expr.cpp
index a70169b54890798658cfe389238afce1aa00ab2d..13bd7b7b303cf385d8cce21f8e2f8fe8cc988b56 100644
--- a/test/unit/test_s_expr.cpp
+++ b/test/unit/test_s_expr.cpp
@@ -136,6 +136,7 @@ TEST(regloc, round_tripping) {
         "(proximal (join (tag 1) (tag 2)))",
         "(uniform (tag 1) 0 100 52)",
         "(restrict (terminal) (tag 12))",
+        "(on-components 0.3 (segment 2))",
         "(join (terminal) (root))",
         "(sum (terminal) (root))",
     };