diff --git a/substrate/primitives/api/proc-macro/src/decl_runtime_apis.rs b/substrate/primitives/api/proc-macro/src/decl_runtime_apis.rs
index 8294c8bfbd68428e15cefd410a15137c9a730d7e..a628ade6f9b476a2b2604b456c215a8545b2a27d 100644
--- a/substrate/primitives/api/proc-macro/src/decl_runtime_apis.rs
+++ b/substrate/primitives/api/proc-macro/src/decl_runtime_apis.rs
@@ -912,6 +912,13 @@ impl CheckTraitDecl {
 				.entry(method.sig.ident.clone())
 				.or_default()
 				.push(changed_in);
+
+			if method.default.is_some() {
+				self.errors.push(Error::new(
+					method.default.span(),
+					"A runtime API function cannot have a default implementation!",
+				));
+			}
 		});
 
 		method_to_signature_changed.into_iter().for_each(|(f, changed)| {
diff --git a/substrate/primitives/api/test/tests/ui/no_default_implementation.rs b/substrate/primitives/api/test/tests/ui/no_default_implementation.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6af93d6b865399c85b4d0756cb4357a4b71e21b2
--- /dev/null
+++ b/substrate/primitives/api/test/tests/ui/no_default_implementation.rs
@@ -0,0 +1,9 @@
+sp_api::decl_runtime_apis! {
+	pub trait Api {
+		fn test() {
+			println!("Hey, I'm a default implementation!");
+		}
+	}
+}
+
+fn main() {}
diff --git a/substrate/primitives/api/test/tests/ui/no_default_implementation.stderr b/substrate/primitives/api/test/tests/ui/no_default_implementation.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..0ccece1441916245bd43517842cd0335395cbdf6
--- /dev/null
+++ b/substrate/primitives/api/test/tests/ui/no_default_implementation.stderr
@@ -0,0 +1,8 @@
+error: A runtime API function cannot have a default implementation!
+ --> $DIR/no_default_implementation.rs:3:13
+  |
+3 |           fn test() {
+  |  ___________________^
+4 | |             println!("Hey, I'm a default implementation!");
+5 | |         }
+  | |_________^