diff --git a/model/composite/rope.xml b/model/composite/rope.xml
deleted file mode 100644
index 50865d76..00000000
--- a/model/composite/rope.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/user/user_composite.cc b/src/user/user_composite.cc
index 1041600b..159fb15d 100644
--- a/src/user/user_composite.cc
+++ b/src/user/user_composite.cc
@@ -297,6 +297,8 @@ bool mjCComposite::Make(mjCModel* model, mjCBody* body, char* error, int error_s
return MakeGrid(model, body, error, error_sz);
case mjCOMPTYPE_ROPE:
+ mju_warning("The \"rope\" composite type is deprecated. Please use \"cable\" instead.");
+ [[fallthrough]];
case mjCOMPTYPE_LOOP:
return MakeRope(model, body, error, error_sz);
diff --git a/test/user/user_composite_test.cc b/test/user/user_composite_test.cc
index fe013e75..a4dff825 100644
--- a/test/user/user_composite_test.cc
+++ b/test/user/user_composite_test.cc
@@ -20,6 +20,7 @@
#include
#include
#include
+#include "src/cc/array_safety.h"
#include
#include
#include
@@ -72,9 +73,15 @@ TEST_F(UserCompositeTest, StretchAndTwistAllowed) {
)";
+ static char warning[1024];
+ warning[0] = '\0';
+ mju_user_warning = [](const char* msg) {
+ util::strcpy_arr(warning, msg);
+ };
std::array error;
mjModel* m = LoadModelFromString(xml, error.data(), error.size());
EXPECT_THAT(m, NotNull());
+ EXPECT_THAT(warning, HasSubstr("deprecated"));
mj_deleteModel(m);
}