Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/CodeGen/CodeGenerator.cc	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar 13 23:56:59 2017
-// Update Count     : 477
+// Last Modified On : Wed Mar 15 23:31:48 2017
+// Update Count     : 479
 //
 
@@ -134,5 +134,5 @@
 
 		handleStorageClass( functionDecl );
-		DeclarationNode::print_FuncSpec( output, functionDecl->get_funcSpec() );
+		functionDecl->get_funcSpec().print( output );
 
 		output << genType( functionDecl->get_functionType(), mangleName( functionDecl ), pretty );
@@ -896,5 +896,5 @@
 	void CodeGenerator::handleStorageClass( DeclarationWithType * decl ) {
 		if ( decl->get_storageClasses().val != 0 ) {
-			DeclarationNode::print_StorageClass( output, decl->get_storageClasses() );
+			decl->get_storageClasses().print( output );
 		} // if
 	} // CodeGenerator::handleStorageClass
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/Parser/DeclarationNode.cc	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar 15 22:31:36 2017
-// Update Count     : 983
+// Last Modified On : Wed Mar 15 23:36:49 2017
+// Update Count     : 997
 //
 
@@ -33,6 +33,6 @@
 
 // These must remain in the same order as the corresponding DeclarationNode enumerations.
-const char * DeclarationNode::storageClassNames[] = { "extern", "static", "auto", "register", "_Thread_local", "NoStorageClassNames" };
-const char * DeclarationNode::funcSpecifierNames[] = { "inline", "fortran", "_Noreturn", "NoFunctionSpecifierNames" };
+const char * DeclarationNode::StorageClasses::Names[] = { "extern", "static", "auto", "register", "_Thread_local", "NoStorageClassNames" };
+const char * DeclarationNode::FuncSpecifiers::Names[] = { "inline", "fortran", "_Noreturn", "NoFunctionSpecifierNames" };
 const char * DeclarationNode::basicTypeNames[] = { "void", "_Bool", "char", "int", "float", "double", "long double", "NoBasicTypeNames" };
 const char * DeclarationNode::complexTypeNames[] = { "_Complex", "_Imaginary", "NoComplexTypeNames" };
@@ -115,24 +115,4 @@
 }
 
-void DeclarationNode::print_StorageClass( std::ostream & output, StorageClasses storageClasses ) {
-	if ( storageClasses.val != 0 ) {					// storage classes ?
-		for ( unsigned int i = 0; i < DeclarationNode::NumStorageClass; i += 1 ) {
-			if ( storageClasses[i] ) {
-				output << DeclarationNode::storageClassNames[i] << ' ';
-			} // if
-		} // for
-	} // if
-} // print_StorageClass
-
-void DeclarationNode::print_FuncSpec( std::ostream & output, DeclarationNode::FuncSpecifiers funcSpec ) {
-	if ( funcSpec.val != 0 ) {							// function specifiers ?
-		for ( unsigned int i = 0; i < DeclarationNode::NumFuncSpecifier; i += 1 ) {
-			if ( funcSpec[i] ) {
-				output << DeclarationNode::funcSpecifierNames[i] << ' ';
-			} // if
-		} // for
-	} // if
-} // print_FuncSpec
-
 void DeclarationNode::print( std::ostream &os, int indent ) const {
 	os << string( indent, ' ' );
@@ -147,6 +127,6 @@
 	} // if
 
-	print_StorageClass( os, storageClasses );
-	print_FuncSpec( os, funcSpecs );
+	storageClasses.print( os );
+	funcSpecs.print( os );
 
 	if ( type ) {
@@ -461,5 +441,5 @@
 		for ( unsigned int i = 0; i < Type::NumTypeQualifier; i += 1 ) { // find duplicates
 			if ( qsrc[i] && qdst[i] ) {
-				appendError( error, string( "duplicate " ) + Type::QualifierNames[i] );
+				appendError( error, string( "duplicate " ) + Type::Qualifiers::Names[i] );
 			} // if
 		} // for
@@ -471,20 +451,20 @@
 		for ( unsigned int i = 0; i < NumFuncSpecifier; i += 1 ) { // find duplicates
 			if ( funcSpecs[i] && src->funcSpecs[i] ) {
-				appendError( error, string( "duplicate " ) + DeclarationNode::funcSpecifierNames[i] );
+				appendError( error, string( "duplicate " ) + FuncSpecifiers::Names[i] );
 			} // if
 		} // for
 	} // if
 
-	if ( storageClasses.val != 0 && src->storageClasses.val != 0 ) { // any reason to check ?
+	if ( storageClasses.any() && src->storageClasses.any() ) { // any reason to check ?
 		if ( (storageClasses.val & src->storageClasses.val ) != 0 ) { // duplicates ?
 			for ( unsigned int i = 0; i < NumStorageClass; i += 1 ) { // find duplicates
 				if ( storageClasses[i] && src->storageClasses[i] ) {
-					appendError( error, string( "duplicate " ) + storageClassNames[i] );
+					appendError( error, string( "duplicate " ) + StorageClasses::Names[i] );
 				} // if
 			} // for
 			// src is the new item being added and has a single bit
 		} else if ( ! src->storageClasses.is_threadlocal ) { // conflict ?
-			appendError( error, string( "conflicting " ) + storageClassNames[ffs( storageClasses.val ) - 1] +
-						 " & " + storageClassNames[ffs( src->storageClasses.val ) - 1] );
+			appendError( error, string( "conflicting " ) + StorageClasses::Names[ffs( storageClasses.val ) - 1] +
+						 " & " + StorageClasses::Names[ffs( src->storageClasses.val ) - 1] );
 			src->storageClasses.val = 0;				// FIX to preserve invariant of one basic storage specifier
 		} // if
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/Parser/ParseNode.h	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar 15 22:17:50 2017
-// Update Count     : 762
+// Last Modified On : Wed Mar 15 23:31:02 2017
+// Update Count     : 770
 //
 
@@ -205,4 +205,5 @@
 	enum { Extern = 1 << 0, Static = 1 << 1, Auto = 1 << 2, Register = 1 << 3, Threadlocal = 1 << 4, NumStorageClass = 5 };
 	union StorageClasses {
+		static const char * Names[];
 		unsigned int val;
 		struct {
@@ -213,11 +214,23 @@
 			bool is_threadlocal : 1;
 		};
+
 		StorageClasses() : val( 0 ) {}
 		StorageClasses( unsigned int val ) : val( val ) {}
 		bool operator[]( unsigned int i ) const { return val & (1 << i); }
+		bool any() const { return val != 0; }
+		void print( std::ostream & os ) const {
+			if ( (*this).any() ) {						// any storage classes ?
+				for ( unsigned int i = 0; i < NumStorageClass; i += 1 ) {
+					if ( (*this)[i] ) {
+						os << StorageClasses::Names[i] << ' ';
+					} // if
+				} // for
+			} // if
+		}
 	}; // StorageClasses
 
 	enum { Inline = 1 << 0, Noreturn = 1 << 1, Fortran = 1 << 2, NumFuncSpecifier = 3 };
 	union FuncSpecifiers {
+		static const char * Names[];
 		unsigned int val;
 		struct {
@@ -229,4 +242,14 @@
 		FuncSpecifiers( unsigned int val ) : val( val ) {}
 		bool operator[]( unsigned int i ) const { return val & (1 << i); }
+		bool any() const { return val != 0; }
+		void print( std::ostream & os ) const {
+			if ( (*this).any() ) {						// any function specifiers ?
+				for ( unsigned int i = 0; i < NumFuncSpecifier; i += 1 ) {
+					if ( (*this)[i] ) {
+						os << FuncSpecifiers::Names[i] << ' ';
+					} // if
+				} // for
+			} // if
+		}
 	}; // FuncSpecifiers
 
@@ -239,6 +262,4 @@
 	enum BuiltinType { Valist, Zero, One, NoBuiltinType };
 
-	static const char * storageClassNames[];
-	static const char * funcSpecifierNames[];
 	static const char * basicTypeNames[];
 	static const char * complexTypeNames[];
@@ -348,8 +369,5 @@
 
 	StorageClasses storageClasses;
-	static void print_StorageClass( std::ostream & output, StorageClasses storageClasses );
-
 	FuncSpecifiers funcSpecs;
-	static void print_FuncSpec( std::ostream & output, FuncSpecifiers funcSpecs );
 
 	ExpressionNode * bitfieldWidth;
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/Parser/TypeData.cc	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar 15 22:22:29 2017
-// Update Count     : 555
+// Last Modified On : Wed Mar 15 22:53:04 2017
+// Update Count     : 557
 //
 
@@ -227,5 +227,5 @@
 void TypeData::print( ostream &os, int indent ) const {
 	for ( int i = 0; i < Type::NumTypeQualifier; i += 1 ) {
-		if ( qualifiers[i] ) os << Type::QualifierNames[ i ] << ' ';
+		if ( qualifiers[i] ) os << Type::Qualifiers::Names[ i ] << ' ';
 	} // for
 
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/SynTree/FunctionDecl.cc	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar  7 07:54:58 2017
-// Update Count     : 68
+// Last Modified On : Wed Mar 15 23:33:43 2017
+// Update Count     : 72
 //
 
@@ -65,6 +65,6 @@
 	printAll( get_attributes(), os, indent );
 
-	DeclarationNode::print_StorageClass( os, get_storageClasses() );
-	DeclarationNode::print_FuncSpec( os, get_funcSpec() );
+	get_storageClasses().print( os );
+	get_funcSpec().print( os );
 
 	if ( get_type() ) {
@@ -91,6 +91,6 @@
 	// xxx - should printShort print attributes?
 
-	DeclarationNode::print_StorageClass( os, get_storageClasses() );
-	DeclarationNode::print_FuncSpec( os, get_funcSpec() );
+	get_storageClasses().print( os );
+	get_funcSpec().print( os );
 
 	if ( get_type() ) {
Index: src/SynTree/NamedTypeDecl.cc
===================================================================
--- src/SynTree/NamedTypeDecl.cc	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/SynTree/NamedTypeDecl.cc	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar  7 07:39:41 2017
-// Update Count     : 10
+// Last Modified On : Wed Mar 15 23:25:41 2017
+// Update Count     : 12
 //
 
@@ -39,5 +39,5 @@
 		os << get_name() << ": ";
 	} // if
-	DeclarationNode::print_StorageClass( os, get_storageClasses() );
+	get_storageClasses().print( os );
 	os << typeString();
 	if ( base ) {
@@ -61,5 +61,5 @@
 		os << get_name() << ": ";
 	} // if
-	DeclarationNode::print_StorageClass( os, get_storageClasses() );
+	get_storageClasses().print( os );
 	os << typeString();
 	if ( base ) {
Index: src/SynTree/ObjectDecl.cc
===================================================================
--- src/SynTree/ObjectDecl.cc	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/SynTree/ObjectDecl.cc	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar  7 07:55:24 2017
-// Update Count     : 54
+// Last Modified On : Wed Mar 15 23:26:22 2017
+// Update Count     : 57
 //
 
@@ -47,5 +47,5 @@
 	printAll( get_attributes(), os, indent );
 
-	DeclarationNode::print_StorageClass( os, get_storageClasses() );
+	get_storageClasses().print( os );
 
 	if ( get_type() ) {
@@ -81,5 +81,5 @@
 	// xxx - should printShort print attributes?
 
-	DeclarationNode::print_StorageClass( os, get_storageClasses() );
+	get_storageClasses().print( os );
 
 	if ( get_type() ) {
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/SynTree/Type.cc	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar 15 21:22:16 2017
-// Update Count     : 15
+// Last Modified On : Wed Mar 15 23:14:35 2017
+// Update Count     : 19
 //
 
@@ -59,5 +59,5 @@
 }
 
-const char * Type::QualifierNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic", "NoTypeQualifierNames" };
+const char * Type::Qualifiers::Names[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" };
 
 void Type::print( std::ostream &os, int indent ) const {
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 905eca174bc39ca973894ec0dec9e2036d6eb910)
+++ src/SynTree/Type.h	(revision 6e8bd434e6c282eabe8c3f0bd2232d54731d7adf)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar 15 21:28:09 2017
-// Update Count     : 85
+// Last Modified On : Wed Mar 15 23:28:33 2017
+// Update Count     : 89
 //
 
@@ -24,8 +24,7 @@
 class Type : public BaseSyntaxNode {
   public:
-	static const char * QualifierNames[];
-
 	enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Lvalue = 1 << 3, Mutex = 1 << 4, Atomic = 1 << 5, NumTypeQualifier = 6 };
 	union Qualifiers {
+		static const char * Names[];
 		enum { Mask = ~(Restrict | Lvalue) };
 		unsigned int val;
@@ -38,4 +37,5 @@
 			bool isAtomic : 1;
 		};
+
 		Qualifiers() : val( 0 ) {}
 		Qualifiers( unsigned int val ) : val( val ) {}
@@ -80,5 +80,5 @@
 				for ( unsigned int i = 0; i < NumTypeQualifier; i += 1 ) {
 					if ( (*this)[i] ) {
-						os << QualifierNames[i] << ' ';
+						os << Names[i] << ' ';
 					} // if
 				} // for
