diff --git a/substrate/primitives/api/proc-macro/src/impl_runtime_apis.rs b/substrate/primitives/api/proc-macro/src/impl_runtime_apis.rs
index 74cfa0980623b0dd14c029c520093bd775f4da4d..e439a796e28d451ac47f7ed9858591b02dd50d7f 100644
--- a/substrate/primitives/api/proc-macro/src/impl_runtime_apis.rs
+++ b/substrate/primitives/api/proc-macro/src/impl_runtime_apis.rs
@@ -38,7 +38,7 @@ use syn::{
 	Attribute, Ident, ImplItem, ItemImpl, LitInt, LitStr, Path, Signature, Type, TypePath,
 };
 
-use std::collections::HashSet;
+use std::collections::HashMap;
 
 /// The structure used for parsing the runtime api implementations.
 struct RuntimeApiImpls {
@@ -726,7 +726,7 @@ fn populate_runtime_api_versions(
 fn generate_runtime_api_versions(impls: &[ItemImpl]) -> Result<TokenStream> {
 	let mut result = Vec::<TokenStream>::with_capacity(impls.len());
 	let mut sections = Vec::<TokenStream>::with_capacity(impls.len());
-	let mut processed_traits = HashSet::new();
+	let mut processed_traits = HashMap::new();
 
 	let c = generate_crate_access();
 
@@ -746,13 +746,17 @@ fn generate_runtime_api_versions(impls: &[ItemImpl]) -> Result<TokenStream> {
 			.ident;
 
 		let span = trait_.span();
-		if !processed_traits.insert(trait_) {
-			return Err(Error::new(
+		if let Some(other_span) = processed_traits.insert(trait_, span) {
+			let mut error = Error::new(
 				span,
 				"Two traits with the same name detected! \
 					The trait name is used to generate its ID. \
 					Please rename one trait at the declaration!",
-			))
+			);
+
+			error.combine(Error::new(other_span, "First trait implementation."));
+
+			return Err(error)
 		}
 
 		let id: Path = parse_quote!( #path ID );
diff --git a/substrate/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr b/substrate/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr
index 9e014e3ea821a192e6a6af64c45a23022c67a6f3..2197bbc99cfb1dcd4cd76c627a6280882c5517e2 100644
--- a/substrate/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr
+++ b/substrate/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr
@@ -3,3 +3,9 @@ error: Two traits with the same name detected! The trait name is used to generat
    |
 41 |     impl second::Api<Block> for Runtime {
    |                  ^^^
+
+error: First trait implementation.
+  --> tests/ui/impl_two_traits_with_same_name.rs:37:13
+   |
+37 |     impl self::Api<Block> for Runtime {
+   |                ^^^