Index: src/GenPoly/ScrubTyVars.cc
===================================================================
--- src/GenPoly/ScrubTyVars.cc	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/GenPoly/ScrubTyVars.cc	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 19 16:42:42 2015
-// Update Count     : 2
+// Last Modified On : Thu Mar 16 15:44:27 2017
+// Update Count     : 3
 //
 
@@ -109,5 +109,5 @@
 		if ( Type *dynType = shouldScrub( pointer->get_base() ) ) {
 			Type *ret = dynType->acceptMutator( *this );
-			ret->get_qualifiers() += pointer->get_qualifiers();
+			ret->get_qualifiers() |= pointer->get_qualifiers();
 			pointer->set_base( 0 );
 			delete pointer;
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/Parser/DeclarationNode.cc	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 09:10:57 2017
-// Update Count     : 1007
+// Last Modified On : Thu Mar 16 17:16:31 2017
+// Update Count     : 1014
 //
 
@@ -19,5 +19,4 @@
 #include <algorithm>
 #include <cassert>
-#include <strings.h>									// ffs
 
 #include "TypeData.h"
@@ -243,12 +242,9 @@
 
 DeclarationNode * DeclarationNode::newAggregate( Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
+	assert( name );
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Aggregate );
 	newnode->type->aggregate.kind = kind;
-	if ( name ) {
-		newnode->type->aggregate.name = name;
-	} else {											// anonymous aggregate ?
-		newnode->type->aggregate.name = new string( anonymous.newName() );
-	} // if
+	newnode->type->aggregate.name = name;
 	newnode->type->aggregate.actuals = actuals;
 	newnode->type->aggregate.fields = fields;
@@ -258,11 +254,8 @@
 
 DeclarationNode * DeclarationNode::newEnum( string * name, DeclarationNode * constants, bool body ) {
+	assert( name );
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Enum );
-	if ( name ) {
-		newnode->type->enumeration.name = name;
-	} else {											// anonymous aggregate ?
-		newnode->type->enumeration.name = new string( anonymous.newName() );
-	} // if
+	newnode->type->enumeration.name = name;
 	newnode->type->enumeration.constants = constants;
 	newnode->type->enumeration.body = body;
@@ -436,5 +429,5 @@
 	const Type::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; // optimization
 
-	if ( (qsrc.val & qdst.val) != 0 ) {					// duplicates ?
+	if ( (qsrc & qdst).any() ) {						// duplicates ?
 		for ( unsigned int i = 0; i < Type::NumTypeQualifier; i += 1 ) { // find duplicates
 			if ( qsrc[i] && qdst[i] ) {
@@ -446,5 +439,5 @@
 
 void DeclarationNode::checkSpecifiers( DeclarationNode * src ) {
-	if ( (funcSpecs.val & src->funcSpecs.val) != 0 ) {	// duplicates ?
+	if ( (funcSpecs & src->funcSpecs).any() ) {			// duplicates ?
 		for ( unsigned int i = 0; i < Type::NumFuncSpecifier; i += 1 ) { // find duplicates
 			if ( funcSpecs[i] && src->funcSpecs[i] ) {
@@ -455,5 +448,5 @@
 
 	if ( storageClasses.any() && src->storageClasses.any() ) { // any reason to check ?
-		if ( (storageClasses.val & src->storageClasses.val ) != 0 ) { // duplicates ?
+		if ( (storageClasses & src->storageClasses ).any() ) { // duplicates ?
 			for ( unsigned int i = 0; i < Type::NumStorageClass; i += 1 ) { // find duplicates
 				if ( storageClasses[i] && src->storageClasses[i] ) {
@@ -463,7 +456,7 @@
 			// src is the new item being added and has a single bit
 		} else if ( ! src->storageClasses.is_threadlocal ) { // conflict ?
-			appendError( error, string( "conflicting " ) + Type::StorageClasses::Names[ffs( storageClasses.val ) - 1] +
-						 " & " + Type::StorageClasses::Names[ffs( src->storageClasses.val ) - 1] );
-			src->storageClasses.val = 0;				// FIX to preserve invariant of one basic storage specifier
+			appendError( error, string( "conflicting " ) + Type::StorageClasses::Names[storageClasses.ffs()] +
+						 " & " + Type::StorageClasses::Names[src->storageClasses.ffs()] );
+			src->storageClasses.reset();				// FIX to preserve invariant of one basic storage specifier
 		} // if
 	} // if
@@ -473,6 +466,6 @@
 
 DeclarationNode * DeclarationNode::copySpecifiers( DeclarationNode * q ) {
-	funcSpecs.val |= q->funcSpecs.val;
-	storageClasses.val |= q->storageClasses.val;
+	funcSpecs |= q->funcSpecs;
+	storageClasses |= q->storageClasses;
 
 	for ( Attribute *attr: reverseIterate( q->attributes ) ) {
@@ -497,5 +490,5 @@
 		src = nullptr;
 	} else {
-		dst->qualifiers += src->qualifiers;
+		dst->qualifiers |= src->qualifiers;
 	} // if
 } // addQualifiersToType
@@ -555,10 +548,10 @@
 		switch ( dst->kind ) {
 		  case TypeData::Unknown:
-			src->qualifiers += dst->qualifiers;
+			src->qualifiers |= dst->qualifiers;
 			dst = src;
 			src = nullptr;
 			break;
 		  case TypeData::Basic:
-			dst->qualifiers += src->qualifiers;
+			dst->qualifiers |= src->qualifiers;
 			if ( src->kind != TypeData::Unknown ) {
 				assert( src->kind == TypeData::Basic );
@@ -596,5 +589,5 @@
 					dst->base->aggInst.params = maybeClone( src->aggregate.actuals );
 				} // if
-				dst->base->qualifiers += src->qualifiers;
+				dst->base->qualifiers |= src->qualifiers;
 				src = nullptr;
 				break;
@@ -628,5 +621,5 @@
 						type->aggInst.hoistType = o->type->enumeration.body;
 					} // if
-					type->qualifiers += o->type->qualifiers;
+					type->qualifiers |= o->type->qualifiers;
 				} else {
 					type = o->type;
@@ -784,5 +777,5 @@
 					p->type->base->aggInst.params = maybeClone( type->aggregate.actuals );
 				} // if
-				p->type->base->qualifiers += type->qualifiers;
+				p->type->base->qualifiers |= type->qualifiers;
 				break;
 
@@ -821,5 +814,5 @@
 				lastArray->base->aggInst.params = maybeClone( type->aggregate.actuals );
 			} // if
-			lastArray->base->qualifiers += type->qualifiers;
+			lastArray->base->qualifiers |= type->qualifiers;
 			break;
 		  default:
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/Parser/parser.yy	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:36:17 2017
-// Update Count     : 2310
+// Last Modified On : Thu Mar 16 12:57:03 2017
+// Update Count     : 2316
 //
 
@@ -1608,5 +1608,5 @@
 aggregate_type:											// struct, union
 	aggregate_key attribute_list_opt '{' field_declaration_list '}'
-		{ $$ = DeclarationNode::newAggregate( $1, nullptr, nullptr, $4, true )->addQualifiers( $2 ); }
+		{ $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), nullptr, $4, true )->addQualifiers( $2 ); }
 	| aggregate_key attribute_list_opt no_attr_identifier_or_type_name
 		{ typedefTable.makeTypedef( *$3 ); }
@@ -1614,5 +1614,5 @@
 		{ $$ = DeclarationNode::newAggregate( $1, $3, nullptr, $6, true )->addQualifiers( $2 ); }
 	| aggregate_key attribute_list_opt '(' type_name_list ')' '{' field_declaration_list '}' // CFA
-		{ $$ = DeclarationNode::newAggregate( $1, nullptr, $4, $7, false )->addQualifiers( $2 ); }
+		{ $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $4, $7, false )->addQualifiers( $2 ); }
 	| aggregate_type_nobody
 	;
@@ -1684,6 +1684,6 @@
 	// empty
 		{ $$ = DeclarationNode::newName( 0 ); /* XXX */ } // CFA, no field name
-	// '@' // empty
-	// 	{ $$ = DeclarationNode::newName( 0 ); /* XXX */ } // CFA, no field name
+	// '@'
+	// 	{ $$ = DeclarationNode::newName( new string( DeclarationNode::anonymous.newName() ) ); } // CFA, no field name
 	| bit_subrange_size									// no field name
 		{ $$ = DeclarationNode::newBitfield( $1 ); }
@@ -1711,5 +1711,5 @@
 enum_type:												// enum
 	ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
-		{ $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); }
+		{ $$ = DeclarationNode::newEnum( new string( DeclarationNode::anonymous.newName() ), $4, true )->addQualifiers( $2 ); }
 	| ENUM attribute_list_opt no_attr_identifier_or_type_name
 		{ typedefTable.makeTypedef( *$3 ); }
Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/ResolvExpr/CommonType.cc	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 06:59:27 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  2 17:35:34 2016
-// Update Count     : 3
+// Last Modified On : Thu Mar 16 16:24:31 2017
+// Update Count     : 7
 //
 
@@ -71,5 +71,5 @@
 							if ( unifyExact( type1, type->get_base(), env, have, need, newOpen, indexer ) ) {
 								result = type1->clone();
-								result->get_qualifiers() = tq1 + tq2;
+								result->get_qualifiers() = tq1 | tq2;
 							} // if
 							type1->get_qualifiers() = tq1;
@@ -133,5 +133,5 @@
 			BasicType::Kind newType = combinedType[ basicType->get_kind() ][ otherBasic->get_kind() ];
 			if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= otherBasic->get_qualifiers() ) || widenFirst ) && ( ( newType == otherBasic->get_kind() && basicType->get_qualifiers() <= otherBasic->get_qualifiers() ) || widenSecond ) ) {
-				result = new BasicType( basicType->get_qualifiers() + otherBasic->get_qualifiers(), newType );
+				result = new BasicType( basicType->get_qualifiers() | otherBasic->get_qualifiers(), newType );
 			} // if
 		} else if ( dynamic_cast< EnumInstType * > ( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) {
@@ -139,5 +139,5 @@
 			BasicType::Kind newType = combinedType[ basicType->get_kind() ][ BasicType::SignedInt ];
 			if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= type2->get_qualifiers() ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->get_qualifiers() <= type2->get_qualifiers() ) || widenSecond ) ) {
-				result = new BasicType( basicType->get_qualifiers() + type2->get_qualifiers(), newType );
+				result = new BasicType( basicType->get_qualifiers() | type2->get_qualifiers(), newType );
 			} // if
 		} // if
@@ -154,5 +154,5 @@
 		}
 		result = voidPointer->clone();
-		result->get_qualifiers() += otherPointer->get_qualifiers();
+		result->get_qualifiers() |= otherPointer->get_qualifiers();
 	}
 
@@ -176,5 +176,5 @@
 						result = otherPointer->clone();
 					} // if
-					result->get_qualifiers() = tq1 + tq2;
+					result->get_qualifiers() = tq1 | tq2;
 				} else {
 					/// std::cout << "place for ptr-to-type" << std::endl;
@@ -185,5 +185,5 @@
 		} else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) {
 			result = pointerType->clone();
-			result->get_qualifiers() += type2->get_qualifiers();
+			result->get_qualifiers() |= type2->get_qualifiers();
 		} // if
 	}
@@ -230,5 +230,5 @@
 					if ( unifyExact( type->get_base(), type2, env, have, need, newOpen, indexer ) ) {
 						result = type2->clone();
-						result->get_qualifiers() = tq1 + tq2;
+						result->get_qualifiers() = tq1 | tq2;
 					} // if
 					type2->get_qualifiers() = tq2;
@@ -250,9 +250,9 @@
 				if ( widenSecond || zeroType->get_qualifiers() <= type2->get_qualifiers() ) {
 					result = type2->clone();
-					result->get_qualifiers() += zeroType->get_qualifiers();
+					result->get_qualifiers() |= zeroType->get_qualifiers();
 				}
 			} else if ( widenSecond && dynamic_cast< OneType* >( type2 ) ) {
 				result = new BasicType( zeroType->get_qualifiers(), BasicType::SignedInt );
-				result->get_qualifiers() += type2->get_qualifiers();
+				result->get_qualifiers() |= type2->get_qualifiers();
 			}
 		}
@@ -264,9 +264,9 @@
 				if ( widenSecond || oneType->get_qualifiers() <= type2->get_qualifiers() ) {
 					result = type2->clone();
-					result->get_qualifiers() += oneType->get_qualifiers();
+					result->get_qualifiers() |= oneType->get_qualifiers();
 				}
 			} else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) {
 				result = new BasicType( oneType->get_qualifiers(), BasicType::SignedInt );
-				result->get_qualifiers() += type2->get_qualifiers();
+				result->get_qualifiers() |= type2->get_qualifiers();
 			}
 		}
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/ResolvExpr/Unify.cc	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 12:27:10 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 07:59:59 2017
-// Update Count     : 40
+// Last Modified On : Thu Mar 16 16:22:54 2017
+// Update Count     : 42
 //
 
@@ -353,5 +353,5 @@
 #endif
 			if ( ( common = commonType( type1, type2, widenMode.widenFirst, widenMode.widenSecond, indexer, env, openVars ) ) ) {
-				common->get_qualifiers() = tq1 + tq2;
+				common->get_qualifiers() = tq1 | tq2;
 #ifdef DEBUG
 				std::cerr << "unifyInexact: common type is ";
@@ -370,5 +370,5 @@
 				if ( ( tq1 > tq2 || widenMode.widenFirst ) && ( tq2 > tq1 || widenMode.widenSecond ) ) {
 					common = type1->clone();
-					common->get_qualifiers() = tq1 + tq2;
+					common->get_qualifiers() = tq1 | tq2;
 					result = true;
 				} else {
Index: src/SymTab/ImplementationType.cc
===================================================================
--- src/SymTab/ImplementationType.cc	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/SymTab/ImplementationType.cc	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:32:01 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  2 17:31:20 2016
-// Update Count     : 3
+// Last Modified On : Thu Mar 16 15:54:08 2017
+// Update Count     : 4
 //
 
@@ -105,5 +105,5 @@
 		if ( typeDecl && typeDecl->get_base() ) {
 			Type *base = implementationType( typeDecl->get_base(), indexer );
-			base->get_qualifiers() += inst->get_qualifiers();
+			base->get_qualifiers() |= inst->get_qualifiers();
 			result = base;
 		} // if
@@ -114,5 +114,5 @@
 		for ( std::list< Type* >::iterator i = tupleType->get_types().begin(); i != tupleType->get_types().end(); ++i ) {
 			Type *implType = implementationType( *i, indexer );
-			implType->get_qualifiers() += tupleType->get_qualifiers();
+			implType->get_qualifiers() |= tupleType->get_qualifiers();
 			newType->get_types().push_back( implType );
 		} // for
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/SymTab/Validate.cc	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:50:04 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 08:02:54 2017
-// Update Count     : 351
+// Last Modified On : Thu Mar 16 16:39:15 2017
+// Update Count     : 353
 //
 
@@ -611,5 +611,5 @@
 		if ( def != typedefNames.end() ) {
 			Type *ret = def->second.first->get_base()->clone();
-			ret->get_qualifiers() += typeInst->get_qualifiers();
+			ret->get_qualifiers() |= typeInst->get_qualifiers();
 			// place instance parameters on the typedef'd type
 			if ( ! typeInst->get_parameters().empty() ) {
@@ -656,9 +656,11 @@
 		// hence the type-name "screen" must be defined.
 		// Note, qualifiers on the typedef are superfluous for the forward declaration.
-		if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( tyDecl->get_base() ) ) {
+
+		Type *designatorType = tyDecl->get_base()->stripDeclarator();
+		if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) {
 			return new StructDecl( aggDecl->get_name() );
-		} else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( tyDecl->get_base() ) ) {
+		} else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) {
 			return new UnionDecl( aggDecl->get_name() );
-		} else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( tyDecl->get_base() ) ) {
+		} else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) {
 			return new EnumDecl( enumDecl->get_name() );
 		} else {
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/SynTree/Type.cc	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 10:25:06 2017
-// Update Count     : 23
+// Last Modified On : Thu Mar 16 16:25:49 2017
+// Update Count     : 27
 //
 
@@ -19,4 +19,5 @@
 #include "Declaration.h"
 #include "Attribute.h"
+#include "InitTweak/InitTweak.h"
 #include "Common/utility.h"
 
@@ -64,4 +65,12 @@
 const char * Type::Qualifiers::Names[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" };
 
+Type *Type::stripDeclarator() {
+	Type * type = this;
+	while ( Type * at = InitTweak::getPointerBase( type ) ) {
+		type = at;
+	}
+	return type;
+}
+
 void Type::print( std::ostream &os, int indent ) const {
 	if ( ! forall.empty() ) {
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/SynTree/Type.h	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 12:11:50 2017
-// Update Count     : 116
+// Last Modified On : Thu Mar 16 17:44:11 2017
+// Update Count     : 135
 //
 
@@ -21,11 +21,34 @@
 #include "SynTree.h"
 #include "Visitor.h"
+#include <strings.h>									// ffs
 
 class Type : public BaseSyntaxNode {
   public:
-	#define CommonBF( N ) \
+	// Simulate inheritance because union does not allow it.
+	#define BFCommon( BFType, N ) \
 		bool operator[]( unsigned int i ) const { return val & (1 << i); } \
 		bool any() const { return val != 0; } \
+		void reset() { val = 0; } \
+		int ffs() { return ::ffs( val ) - 1; } \
 		static const char * Names[]; \
+		BFType operator&=( BFType other ) { \
+			val &= other.val; return *this; \
+		} \
+	 	BFType operator&( BFType other ) const { \
+			BFType q = other; \
+			q &= *this; \
+			return q; \
+		} \
+	 	BFType operator|=( BFType other ) { \
+			val |= other.val; return *this; \
+		} \
+	 	BFType operator|( BFType other ) const { \
+			BFType q = other; \
+			q |= *this; \
+			return q; \
+		} \
+	 	BFType operator-=( BFType other ) { \
+			val &= ~other.val; return *this; \
+		} \
 		void print( std::ostream & os ) const { \
 			if ( (*this).any() ) { \
@@ -50,5 +73,7 @@
 		FuncSpecifiers() : val( 0 ) {}
 		FuncSpecifiers( unsigned int val ) : val( val ) {}
-		CommonBF( NumFuncSpecifier )
+		bool operator==( FuncSpecifiers other ) const {	return val == other.val; }
+		bool operator!=( FuncSpecifiers other ) const { return val != other.val; }
+		BFCommon( FuncSpecifiers, NumFuncSpecifier )
 	}; // FuncSpecifiers
 
@@ -66,5 +91,7 @@
 		StorageClasses() : val( 0 ) {}
 		StorageClasses( unsigned int val ) : val( val ) {}
-		CommonBF( NumStorageClass )
+		bool operator==( StorageClasses other ) const {	return val == other.val; }
+		bool operator!=( StorageClasses other ) const { return val != other.val; }
+		BFCommon( StorageClasses, NumStorageClass )
 	}; // StorageClasses
 
@@ -92,31 +119,10 @@
 		bool operator<=( Qualifiers other ) const {
 			return isConst <= other.isConst && isVolatile <= other.isVolatile &&
-				isMutex == other.isMutex && isAtomic == other.isAtomic;
+				isMutex >= other.isMutex && isAtomic == other.isAtomic;
 		}
-	 	bool operator>=( Qualifiers other ) const {
-			return isConst >= other.isConst	&& isVolatile >= other.isVolatile &&
-				isMutex == other.isMutex && isAtomic == other.isAtomic;
-		}
-		bool operator<( Qualifiers other ) const {
-			return *this != other && *this <= other;
-		}
-	 	bool operator>( Qualifiers other ) const {
-			return *this != other && *this >= other;
-		}
-		Qualifiers operator&=( Type::Qualifiers other ) {
-			val &= other.val; return *this;
-		}
-	 	Qualifiers operator+=( Qualifiers other ) {
-			val |= other.val; return *this;
-		}
-	 	Qualifiers operator-=( Qualifiers other ) {
-			val &= ~other.val; return *this;
-		}
-	 	Qualifiers operator+( Qualifiers other ) const {
-			Qualifiers q = other;
-			q += *this;
-			return q;
-		}
-		CommonBF( NumTypeQualifier )
+		bool operator<( Qualifiers other ) const { return *this != other && *this <= other; }
+	 	bool operator>=( Qualifiers other ) const { return ! (*this < other); }
+	 	bool operator>( Qualifiers other ) const { return *this != other && *this >= other; }
+		BFCommon( Qualifiers, NumTypeQualifier )
 	}; // Qualifiers
 
@@ -147,4 +153,6 @@
 	virtual bool isVoid() const { return size() == 0; }
 	virtual Type * getComponent( unsigned i ) { assertf( size() == 1 && i == 0, "Type::getComponent was called with size %d and index %d\n", size(), i ); return this; }
+
+	Type *stripDeclarator();
 
 	virtual bool isComplete() const { return true; }
Index: src/SynTree/TypeSubstitution.cc
===================================================================
--- src/SynTree/TypeSubstitution.cc	(revision d6d747d310b594f713f0f8df9f93ae69b21c6bf3)
+++ src/SynTree/TypeSubstitution.cc	(revision 6f950007fd85cf2f04928840823d690ed9c9d98b)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Apr 26 11:15:29 2016
-// Update Count     : 3
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Mar 16 15:54:35 2017
+// Update Count     : 4
 //
 
@@ -127,5 +127,5 @@
 		subCount++;
 		Type *newtype = i->second->clone();
-		newtype->get_qualifiers() += inst->get_qualifiers();
+		newtype->get_qualifiers() |= inst->get_qualifiers();
 		delete inst;
 		return newtype;
