diff --git a/substrate/srml/support/procedural/src/storage/genesis_config/genesis_config_def.rs b/substrate/srml/support/procedural/src/storage/genesis_config/genesis_config_def.rs
index 8944a924724a9969b5fdff575bd3bf7e5b88d4fe..4bf665de71fa606709e472728ca9f957a17c60a9 100644
--- a/substrate/srml/support/procedural/src/storage/genesis_config/genesis_config_def.rs
+++ b/substrate/srml/support/procedural/src/storage/genesis_config/genesis_config_def.rs
@@ -18,14 +18,14 @@
 
 use srml_support_procedural_tools::syn_ext as ext;
 use proc_macro2::TokenStream;
-use syn::parse_quote;
+use syn::{spanned::Spanned, parse_quote};
 use quote::quote;
 use super::super::{DeclStorageDefExt, StorageLineTypeDef};
 
 pub struct GenesisConfigFieldDef {
-	pub doc: Vec<syn::Meta>,
 	pub name: syn::Ident,
 	pub typ: syn::Type,
+	pub attrs: Vec<syn::Meta>,
 	pub default: TokenStream,
 }
 
@@ -43,8 +43,8 @@ pub struct GenesisConfigDef {
 }
 
 impl GenesisConfigDef {
-	pub fn from_def(def: &DeclStorageDefExt) -> Self {
-		let fields = Self::get_genesis_config_field_defs(def);
+	pub fn from_def(def: &DeclStorageDefExt) -> syn::Result<Self> {
+		let fields = Self::get_genesis_config_field_defs(def)?;
 
 		let is_generic = fields.iter()
 			.any(|field| ext::type_contains_ident(&field.typ, &def.module_runtime_generic));
@@ -71,17 +71,19 @@ impl GenesisConfigDef {
 			(quote!(), quote!(), quote!(), None)
 		};
 
-		Self {
+		Ok(Self {
 			is_generic,
 			fields,
 			genesis_struct_decl,
 			genesis_struct,
 			genesis_impl,
 			genesis_where_clause,
-		}
+		})
 	}
 
-	fn get_genesis_config_field_defs(def: &DeclStorageDefExt) -> Vec<GenesisConfigFieldDef> {
+	fn get_genesis_config_field_defs(def: &DeclStorageDefExt)
+		-> syn::Result<Vec<GenesisConfigFieldDef>>
+	{
 		let mut config_field_defs = Vec::new();
 
 		for (config_field, line) in def.storage_lines.iter()
@@ -114,31 +116,39 @@ impl GenesisConfigDef {
 				.unwrap_or_else(|| quote!( Default::default() ));
 
 			config_field_defs.push(GenesisConfigFieldDef {
-				doc: line.doc_attrs.clone(),
 				name: config_field,
 				typ,
+				attrs: line.doc_attrs.clone(),
 				default,
 			});
 		}
 
 		for line in &def.extra_genesis_config_lines {
-			let doc = line.attrs.iter()
-				.filter_map(|a| a.parse_meta().ok())
-				.filter(|m| m.path().is_ident("doc"))
-				.collect();
+			let attrs = line.attrs.iter()
+				.map(|attr| {
+					let meta = attr.parse_meta()?;
+					if meta.path().is_ident("cfg") {
+						return Err(syn::Error::new(
+							meta.span(),
+							"extra genesis config items do not support `cfg` attribute"
+						));
+					}
+					Ok(meta)
+				})
+				.collect::<syn::Result<_>>()?;
 
 			let default = line.default.as_ref().map(|e| quote!( #e ))
 				.unwrap_or_else(|| quote!( Default::default() ));
 
 
 			config_field_defs.push(GenesisConfigFieldDef {
-				doc,
 				name: line.name.clone(),
 				typ: line.typ.clone(),
+				attrs,
 				default,
 			});
 		}
 
-		config_field_defs
+		Ok(config_field_defs)
 	}
 }
diff --git a/substrate/srml/support/procedural/src/storage/genesis_config/mod.rs b/substrate/srml/support/procedural/src/storage/genesis_config/mod.rs
index 2d4d4af3861ed56c186f15de4352b0aa0a9ca372..109957926a7759aa1122685d257847452f990a8c 100644
--- a/substrate/srml/support/procedural/src/storage/genesis_config/mod.rs
+++ b/substrate/srml/support/procedural/src/storage/genesis_config/mod.rs
@@ -33,13 +33,13 @@ fn decl_genesis_config_and_impl_default(
 	genesis_config: &GenesisConfigDef,
 ) -> TokenStream {
 	let config_fields = genesis_config.fields.iter().map(|field| {
-		let (name, typ, doc) = (&field.name, &field.typ, &field.doc);
-		quote!( #( #[ #doc] )* pub #name: #typ, )
+		let (name, typ, attrs) = (&field.name, &field.typ, &field.attrs);
+		quote!( #( #[ #attrs] )* pub #name: #typ, )
 	});
 
 	let config_field_defaults = genesis_config.fields.iter().map(|field| {
-		let (name, default, doc) = (&field.name, &field.default, &field.doc);
-		quote!( #( #[ #doc] )* #name: #default, )
+		let (name, default) = (&field.name, &field.default);
+		quote!( #name: #default, )
 	});
 
 	let serde_bug_bound = if !genesis_config.fields.is_empty() {
@@ -188,10 +188,13 @@ pub fn genesis_config_and_build_storage(
 ) -> TokenStream {
 	let builders = BuilderDef::from_def(scrate, def);
 	if !builders.blocks.is_empty() {
-		let genesis_config = &GenesisConfigDef::from_def(def);
+		let genesis_config = match GenesisConfigDef::from_def(def) {
+			Ok(genesis_config) => genesis_config,
+			Err(err) => return err.to_compile_error(),
+		};
 		let decl_genesis_config_and_impl_default =
-			decl_genesis_config_and_impl_default(scrate, genesis_config);
-		let impl_build_storage = impl_build_storage(scrate, def, genesis_config, &builders);
+			decl_genesis_config_and_impl_default(scrate, &genesis_config);
+		let impl_build_storage = impl_build_storage(scrate, def, &genesis_config, &builders);
 
 		quote!{
 			#decl_genesis_config_and_impl_default