Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 4563a956eb56d3c7135208399eafd37c72ea72d3)
+++ src/Parser/DeclarationNode.cc	(revision 7d05e7e1d81b9041e298ff69ebfbf7fdff9b0733)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Aug 29 22:30:56 2016
-// Update Count     : 327
+// Last Modified On : Fri Sep  9 23:21:47 2016
+// Update Count     : 402
 //
 
@@ -43,20 +43,19 @@
 extern LinkageSpec::Spec linkage;						// defined in parser.yy
 
-DeclarationNode::DeclarationNode()
-		: type( 0 )
-		, storageClass( NoStorageClass )
-		, isInline( false )
-		, isNoreturn( false )
-		, bitfieldWidth( 0 )
-		, initializer( 0 )
-		, hasEllipsis( false )
-		, linkage( ::linkage )
-		, extension( false )
-		, error() {
+DeclarationNode::DeclarationNode() :
+		type( 0 ),
+		storageClass( NoStorageClass ),
+		isInline( false ),
+		isNoreturn( false ),
+		bitfieldWidth( 0 ),
+		initializer( 0 ),
+		hasEllipsis( false ),
+		linkage( ::linkage ),
+		extension( false ) {
+	variable.tyClass = DeclarationNode::Type;
+	variable.assertions = nullptr;
+
 	attr.expr = nullptr;
 	attr.type = nullptr;
-
-	variable.tyClass = DeclarationNode::Type;
-	variable.assertions = nullptr;
 }
 
@@ -393,14 +392,9 @@
 
 	if ( (qsrc & qdst).any() ) {						// common bits between qualifier masks ?
-		error = "duplicate qualifier ";
-		int j = 0;										// separator detector
-		for ( int i = 0; i < DeclarationNode::NoOfQualifier; i += 1 ) {
-			if ( qsrc[i] & qdst[i] ) {					// find specific qualifiers in common
-				if ( j > 0 ) error += ", ";
-				error += DeclarationNode::qualifierName[i];
-				j += 1;
+		for ( int i = 0; i < NoOfQualifier; i += 1 ) {	// find common qualifiers
+			if ( qsrc[i] & qdst[i] ) {
+				error += string(error.empty() ? "" : ", ") + "duplicate " + DeclarationNode::qualifierName[i];
 			} // if
 		} // for
-		error += " in declaration of ";
 	} // if
 } // DeclarationNode::checkQualifiers
@@ -442,9 +436,15 @@
 		storageClass = q->storageClass;
 	} else if ( q->storageClass != NoStorageClass ) {
-		q->error = "invalid combination of storage classes in declaration of ";
-	} // if
-	if ( error.empty() ) error = q->error;
-	return this;
-}
+		if ( storageClass == q->storageClass ) {
+			q->error += string( "duplicate " ) + storageName[ storageClass ];
+		} else {										// can only have one storage class
+			q->error += string( "multiple " ) + storageName[ storageClass ] + " & " + storageName[ q->storageClass ];
+		} // if
+	} // if
+	if ( ! q->error.empty() ) {
+		error += (! error.empty() ? ", " : "") + q->error;
+	} // if
+	return this;
+} // DeclarationNode::copyStorageClasses
 
 static void addTypeToType( TypeData *&src, TypeData *&dst ) {
@@ -908,5 +908,5 @@
 
 Declaration *DeclarationNode::build() const {
-	if ( ! error.empty() ) throw SemanticError( error, this );
+	if ( ! error.empty() ) throw SemanticError( error + " in declaration of ", this );
 	if ( type ) {
 		if ( type->kind == TypeData::Variable ) {
@@ -922,5 +922,5 @@
 		return (new ObjectDecl( name, storageClass, linkage, maybeBuild< Expression >( bitfieldWidth ), 0, maybeBuild< Initializer >( initializer ) ))->set_extension( extension );
 	} // if
-	throw SemanticError( "invalid function specifier in declaration of ", this );
+	throw SemanticError( "invalid function specifier ", this );
 }
 
@@ -971,24 +971,4 @@
 }
 
-// DeclarationNode::StorageClass DeclarationNode::buildStorageClass() const {
-// 	DeclarationNode::StorageClass ret = DeclarationNode::NoStorageClass;
-// 	for ( std::list< DeclarationNode::StorageClass >::const_iterator i = storageClasses.begin(); i != storageClasses.end(); ++i ) {
-// 	  if ( *i == DeclarationNode::Inline || *i == DeclarationNode::Noreturn ) continue; // ignore function specifiers
-// 	  if ( ret != DeclarationNode::NoStorageClass ) {	// already have a valid storage class ?
-// 			throw SemanticError( "invalid combination of storage classes in declaration of ", this );
-// 		} // if
-// 		ret = *i;
-// 	} // for
-// 	return ret;
-// }
-
-// bool DeclarationNode::buildFuncSpecifier( DeclarationNode::StorageClass key ) const {
-// 	std::list< DeclarationNode::StorageClass >::const_iterator first = std::find( storageClasses.begin(), storageClasses.end(), key );
-//   if ( first == storageClasses.end() ) return false;	// not found
-// 	first = std::find( ++first, storageClasses.end(), key ); // found
-//   if ( first == storageClasses.end() ) return true;		// not found again
-// 	throw SemanticError( "duplicate function specifier in declaration of ", this );
-// }
-
 // Local Variables: //
 // tab-width: 4 //
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 4563a956eb56d3c7135208399eafd37c72ea72d3)
+++ src/Parser/ParseNode.h	(revision 7d05e7e1d81b9041e298ff69ebfbf7fdff9b0733)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Aug 29 21:45:43 2016
-// Update Count     : 583
+// Last Modified On : Thu Sep  8 21:58:06 2016
+// Update Count     : 587
 //
 
@@ -290,10 +290,4 @@
 	// bool buildFuncSpecifier( StorageClass key ) const;
 
-	struct Enumeration_t {
-		std::string name;
-		DeclarationNode * constants;
-	};
-	Enumeration_t enumeration;
-
 	struct Variable_t {
 		DeclarationNode::TypeClass tyClass;
@@ -408,5 +402,4 @@
 			if ( result ) {
 				*out++ = result;
-			} else {
 			} // if
 		} catch( SemanticError &e ) {
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 4563a956eb56d3c7135208399eafd37c72ea72d3)
+++ src/Parser/TypeData.h	(revision 7d05e7e1d81b9041e298ff69ebfbf7fdff9b0733)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:18:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Aug 29 22:31:52 2016
-// Update Count     : 110
+// Last Modified On : Fri Sep  9 23:20:55 2016
+// Update Count     : 117
 //
 
@@ -96,9 +96,10 @@
 		Array_t array;
 		Enumeration_t enumeration;
+		// Variable_t variable;
 		Function_t function;
 		Symbolic_t symbolic;
 		DeclarationNode * tuple;
 		ExpressionNode * typeexpr;
-		//Attr_t attr;
+		// Attr_t attr;
 		// DeclarationNode::BuiltinType builtin;
 
Index: src/tests/.expect/declarationErrors.txt
===================================================================
--- src/tests/.expect/declarationErrors.txt	(revision 4563a956eb56d3c7135208399eafd37c72ea72d3)
+++ src/tests/.expect/declarationErrors.txt	(revision 7d05e7e1d81b9041e298ff69ebfbf7fdff9b0733)
@@ -1,65 +1,69 @@
 CFA Version 1.0.0 (debug)
-Error: invalid combination of storage classes in declaration of x9: static const volatile short int 
+Error: duplicate static in declaration of x1: static const volatile short int 
 
-Error: invalid combination of storage classes in declaration of x18: static const volatile instance of const volatile struct __anonymous0
+Error: multiple extern & static in declaration of x2: extern const volatile short int 
+
+Error: multiple extern & auto, multiple extern & static, multiple extern & static, duplicate extern in declaration of x3: extern const volatile short int 
+
+Error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous0
   with members 
    with body 
 
 
-Error: duplicate qualifier volatile in declaration of x19: static const volatile instance of const volatile struct __anonymous1
+Error: duplicate const, duplicate static, duplicate volatile in declaration of x5: static const volatile instance of const volatile struct __anonymous1
   with members 
    with body 
 
 
-Error: invalid combination of storage classes in declaration of x28: static const volatile instance of type Int
+Error: duplicate static in declaration of x6: static const volatile instance of type Int
 
-Error: duplicate qualifier const in declaration of f01: static inline function
+Error: duplicate const in declaration of f01: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier volatile in declaration of f02: static inline function
+Error: duplicate volatile in declaration of f02: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier const in declaration of f03: static inline function
+Error: duplicate const in declaration of f03: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier volatile in declaration of f04: static inline function
+Error: duplicate volatile in declaration of f04: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier const in declaration of f05: static inline function
+Error: duplicate const in declaration of f05: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier volatile in declaration of f06: static inline function
+Error: duplicate volatile in declaration of f06: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier const in declaration of f07: static inline function
+Error: duplicate const in declaration of f07: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier const, volatile in declaration of f08: static inline function
+Error: duplicate const, duplicate volatile in declaration of f08: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier const, volatile in declaration of f09: static inline function
+Error: duplicate const, duplicate volatile in declaration of f09: static inline function
   with no parameters 
   returning const volatile int 
 
 
-Error: duplicate qualifier const, volatile in declaration of f09: static inline function
+Error: duplicate const, duplicate _Atomic, duplicate _Atomic, duplicate const, duplicate restrict, duplicate volatile in declaration of f09: static inline function
   with no parameters 
-  returning const volatile int 
+  returning const restrict volatile _Atomic int 
 
 
Index: src/tests/declarationErrors.c
===================================================================
--- src/tests/declarationErrors.c	(revision 4563a956eb56d3c7135208399eafd37c72ea72d3)
+++ src/tests/declarationErrors.c	(revision 7d05e7e1d81b9041e298ff69ebfbf7fdff9b0733)
@@ -10,13 +10,15 @@
 // Created On       : Wed Aug 17 08:23:43 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 25 18:16:40 2016
-// Update Count     : 5
+// Last Modified On : Fri Sep  9 22:57:52 2016
+// Update Count     : 31
 // 
 
-static short int volatile static const x9;				// duplicate static
-struct { int i; } const static volatile static x18;		// duplicate static
-struct { int i; } const static volatile static volatile x19; // duplicate static & volatile
+static short int volatile static const x1;				// duplicate static
+extern short int static volatile const x2;				// multiple extern & static
+extern short int auto static volatile static extern const x3; // duplicate and multiple storage classes
+struct { int i; } const static volatile static x4;		// duplicate static
+struct { int i; } const static volatile const static volatile x5; // duplicate static & const & volatile
 typedef int Int;
-static Int volatile static const x28;					// duplicate static
+static Int volatile static const x6;					// duplicate static
 
 const static inline const volatile int f01();			// duplicate const
@@ -24,11 +26,11 @@
 const inline const volatile int static f03();			// duplicate const
 volatile inline static const volatile int f04();		// duplicate volatile
-const static const inline volatile int f05();			// duplicate const
-volatile static const volatile inline int f06();		// duplicate volatile
-const static const volatile int inline f07();			// duplicate const
-volatile static const int inline const volatile f08();		// duplicate volatile
+const static int const inline volatile f05();			// duplicate const
+volatile int static const volatile inline f06();		// duplicate volatile
+const static const int volatile inline f07();			// duplicate const
+volatile static const int inline const volatile f08();	// duplicate volatile
 
-volatile static const int inline const volatile f09();		// duplicate volatile
-volatile static const int inline const volatile f09();		// duplicate volatile
+volatile static const int inline const volatile f09();	// duplicate volatile
+_Atomic _Atomic _Atomic volatile restrict static const const int inline restrict const volatile f09();	// duplicate volatile
 
 //Dummy main
