Index: src/CodeTools/TrackLoc.cc
===================================================================
--- src/CodeTools/TrackLoc.cc	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
+++ src/CodeTools/TrackLoc.cc	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -0,0 +1,191 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// TrackLoc.cc --
+//
+// Author           : Andrew Beach
+// Created On       : Tues May 2 15:46:00 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed May 3 14:43:00 2017
+// Update Count     : 0
+//
+
+#include "TrackLoc.h"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <cstdlib>
+
+#include "Common/utility.h"
+#include "Common/VectorMap.h"
+#include "GenPoly/GenPoly.h"
+#include "Parser/LinkageSpec.h"
+#include "SynTree/Declaration.h"
+#include "SynTree/Initializer.h"
+#include "SynTree/Visitor.h"
+
+namespace CodeTools {
+
+    std::ostream & operator<<(std::ostream & out, CodeLocation const & loc) {
+        return out << loc.filename << '[' << loc.linenumber << ']';
+    }
+
+	class LocationPrinter : public Visitor {
+		unsigned int printLevel;
+		unsigned int currentLevel;
+
+		CodeLocation *parent;
+		CodeLocation *lastNode;
+
+    public:
+        LocationPrinter(unsigned int printLevel) :
+            Visitor(), printLevel(printLevel), currentLevel(0),
+			parent(nullptr), lastNode(nullptr)
+        {}
+
+        void print(char const * name, BaseSyntaxNode *node) {
+            for (unsigned int i = 0 ; i < currentLevel ; ++i) {
+				std::cout << "    ";
+			}
+            if (2 <= printLevel) {
+				std::cout << name << '@';
+			}
+			std::cout << node->location << std::endl;
+        }
+
+		void atNode(char const * name, BaseSyntaxNode *node) {
+			if (-1 == node->location.linenumber) {
+				if (nullptr != parent) {
+					node->location.linenumber = parent->linenumber;
+					node->location.filename = parent->filename;
+				} else if (nullptr != lastNode) {
+					node->location.linenumber = lastNode->linenumber;
+					node->location.filename = lastNode->filename;
+				} else {
+					std::cerr << "Top level node has no CodeLocation " <<
+								 name << std::endl;
+					exit(EXIT_FAILURE);
+				}
+			}
+			if (0 < printLevel) {
+				print(name, node);
+			}
+			lastNode = &node->location;
+		}
+
+#define VISIT_FUNCTION(SyntaxNodeType)				\
+		virtual void visit(SyntaxNodeType *node) {	\
+			atNode(#SyntaxNodeType, node);			\
+			++currentLevel;							\
+			CodeLocation * myParent = parent;		\
+			parent = &node->location;				\
+			Visitor::visit(node);					\
+			parent = myParent;						\
+			--currentLevel;							\
+		}
+
+		VISIT_FUNCTION(ObjectDecl)
+		VISIT_FUNCTION(FunctionDecl)
+		VISIT_FUNCTION(StructDecl)
+		VISIT_FUNCTION(UnionDecl)
+		VISIT_FUNCTION(EnumDecl)
+		VISIT_FUNCTION(TraitDecl)
+		VISIT_FUNCTION(TypeDecl)
+		VISIT_FUNCTION(TypedefDecl)
+		VISIT_FUNCTION(AsmDecl)
+
+		VISIT_FUNCTION(CompoundStmt)
+		VISIT_FUNCTION(ExprStmt)
+		VISIT_FUNCTION(AsmStmt)
+		VISIT_FUNCTION(IfStmt)
+		VISIT_FUNCTION(WhileStmt)
+		VISIT_FUNCTION(ForStmt)
+		VISIT_FUNCTION(SwitchStmt)
+		VISIT_FUNCTION(CaseStmt)
+		VISIT_FUNCTION(BranchStmt)
+		VISIT_FUNCTION(ReturnStmt)
+		VISIT_FUNCTION(TryStmt)
+		VISIT_FUNCTION(CatchStmt)
+		VISIT_FUNCTION(FinallyStmt)
+		VISIT_FUNCTION(NullStmt)
+		VISIT_FUNCTION(DeclStmt)
+		VISIT_FUNCTION(ImplicitCtorDtorStmt)
+
+		VISIT_FUNCTION(ApplicationExpr)
+		VISIT_FUNCTION(UntypedExpr)
+		VISIT_FUNCTION(NameExpr)
+		VISIT_FUNCTION(CastExpr)
+		VISIT_FUNCTION(AddressExpr)
+		VISIT_FUNCTION(LabelAddressExpr)
+		VISIT_FUNCTION(UntypedMemberExpr)
+		VISIT_FUNCTION(MemberExpr)
+		VISIT_FUNCTION(VariableExpr)
+		VISIT_FUNCTION(ConstantExpr)
+		VISIT_FUNCTION(SizeofExpr)
+		VISIT_FUNCTION(AlignofExpr)
+		VISIT_FUNCTION(UntypedOffsetofExpr)
+		VISIT_FUNCTION(OffsetofExpr)
+		VISIT_FUNCTION(OffsetPackExpr)
+		VISIT_FUNCTION(AttrExpr)
+		VISIT_FUNCTION(LogicalExpr)
+		VISIT_FUNCTION(ConditionalExpr)
+		VISIT_FUNCTION(CommaExpr)
+		VISIT_FUNCTION(TypeExpr)
+		VISIT_FUNCTION(AsmExpr)
+		VISIT_FUNCTION(ImplicitCopyCtorExpr)
+		VISIT_FUNCTION(ConstructorExpr)
+		VISIT_FUNCTION(CompoundLiteralExpr)
+		VISIT_FUNCTION(UntypedValofExpr)
+		VISIT_FUNCTION(RangeExpr)
+		VISIT_FUNCTION(UntypedTupleExpr)
+		VISIT_FUNCTION(TupleExpr)
+		VISIT_FUNCTION(TupleIndexExpr)
+		VISIT_FUNCTION(MemberTupleExpr)
+		VISIT_FUNCTION(TupleAssignExpr)
+		VISIT_FUNCTION(StmtExpr)
+		VISIT_FUNCTION(UniqueExpr)
+
+		VISIT_FUNCTION(VoidType)
+		VISIT_FUNCTION(BasicType)
+		VISIT_FUNCTION(PointerType)
+		VISIT_FUNCTION(ArrayType)
+		VISIT_FUNCTION(FunctionType)
+		VISIT_FUNCTION(StructInstType)
+		VISIT_FUNCTION(UnionInstType)
+		VISIT_FUNCTION(EnumInstType)
+		VISIT_FUNCTION(TraitInstType)
+		VISIT_FUNCTION(TypeInstType)
+		VISIT_FUNCTION(TupleType)
+		VISIT_FUNCTION(TypeofType)
+		VISIT_FUNCTION(AttrType)
+		VISIT_FUNCTION(VarArgsType)
+		VISIT_FUNCTION(ZeroType)
+		VISIT_FUNCTION(OneType)
+
+		VISIT_FUNCTION(SingleInit)
+		VISIT_FUNCTION(ListInit)
+		VISIT_FUNCTION(ConstructorInit)
+
+		//VISIT_FUNCTION(Subrange)
+
+		//VISIT_FUNCTION(Constant)
+
+	}; // LocationPrinter
+
+	void fillLocations( std::list< Declaration * > & translationUnit,
+			unsigned int printLevel) {
+		LocationPrinter printer(printLevel);
+		acceptAll( translationUnit, printer );
+	}
+
+} // namespace CodeTools
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/CodeTools/TrackLoc.h
===================================================================
--- src/CodeTools/TrackLoc.h	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
+++ src/CodeTools/TrackLoc.h	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -0,0 +1,37 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// TrackLoc.h -- Track CodeLocation information in a translation unit's declarations.
+//
+// Author           : Andrew Beach
+// Created On       : Tues May 2 15:40:00 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed May 3 14:42:00 2017
+// Update Count     : 0
+//
+
+#ifndef TRACKLOC_H
+#define TRACKLOC_H
+
+#include "SynTree/SynTree.h"
+
+namespace CodeTools {
+
+	/// Fill in an approximate CodeLocation for each syntax node.
+	// printLevel: how much printing while filling in the node locations.
+	// 0 - No Printing, 1 - Print Location, 2 - Print Node Type and Location
+	void fillLocations( std::list< Declaration * > &translationUnit,
+			unsigned int printLevel = 0 );
+
+}  // namespace CodeTools
+
+#endif // TRACKLOC_H
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/CodeTools/module.mk
===================================================================
--- src/CodeTools/module.mk	(revision 1ed841f7e049323e1d8acd9b17df225ae010f2a5)
+++ src/CodeTools/module.mk	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -15,3 +15,4 @@
 ###############################################################################
 
-SRC += CodeTools/DeclStats.cc
+SRC += CodeTools/DeclStats.cc \
+	CodeTools/TrackLoc.cc
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 1ed841f7e049323e1d8acd9b17df225ae010f2a5)
+++ src/GenPoly/InstantiateGeneric.cc	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -233,5 +233,5 @@
 				} else {
 					// normalize possibly dtype-static parameter type
-					out.push_back( new TypeExpr{ 
+					out.push_back( new TypeExpr{
 						ScrubTyVars::scrubAll( paramType->get_type()->clone() ) } );
 					gt |= genericType::concrete;
@@ -369,4 +369,5 @@
 				DeclMutator::addDeclaration( concDecl );
 				insert( inst, typeSubs, concDecl );
+				concDecl->acceptMutator( *this ); // recursively instantiate members
 			}
 			StructInstType *newInst = new StructInstType( inst->get_qualifiers(), concDecl->get_name() );
@@ -423,4 +424,5 @@
 				DeclMutator::addDeclaration( concDecl );
 				insert( inst, typeSubs, concDecl );
+				concDecl->acceptMutator( *this ); // recursively instantiate members
 			}
 			UnionInstType *newInst = new UnionInstType( inst->get_qualifiers(), concDecl->get_name() );
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 1ed841f7e049323e1d8acd9b17df225ae010f2a5)
+++ src/Makefile.in	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -108,4 +108,5 @@
 	CodeGen/driver_cfa_cpp-OperatorTable.$(OBJEXT) \
 	CodeTools/driver_cfa_cpp-DeclStats.$(OBJEXT) \
+	CodeTools/driver_cfa_cpp-TrackLoc.$(OBJEXT) \
 	Concurrency/driver_cfa_cpp-Keywords.$(OBJEXT) \
 	Common/driver_cfa_cpp-SemanticError.$(OBJEXT) \
@@ -388,6 +389,7 @@
 	CodeGen/FixNames.cc CodeGen/FixMain.cc \
 	CodeGen/OperatorTable.cc CodeTools/DeclStats.cc \
-	Concurrency/Keywords.cc Common/SemanticError.cc \
-	Common/UniqueName.cc Common/DebugMalloc.cc Common/Assert.cc \
+	CodeTools/TrackLoc.cc Concurrency/Keywords.cc \
+	Common/SemanticError.cc Common/UniqueName.cc \
+	Common/DebugMalloc.cc Common/Assert.cc \
 	ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \
 	ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \
@@ -545,4 +547,6 @@
 	@: > CodeTools/$(DEPDIR)/$(am__dirstamp)
 CodeTools/driver_cfa_cpp-DeclStats.$(OBJEXT):  \
+	CodeTools/$(am__dirstamp) CodeTools/$(DEPDIR)/$(am__dirstamp)
+CodeTools/driver_cfa_cpp-TrackLoc.$(OBJEXT):  \
 	CodeTools/$(am__dirstamp) CodeTools/$(DEPDIR)/$(am__dirstamp)
 Concurrency/$(am__dirstamp):
@@ -843,4 +847,5 @@
 	-rm -f CodeGen/driver_cfa_cpp-OperatorTable.$(OBJEXT)
 	-rm -f CodeTools/driver_cfa_cpp-DeclStats.$(OBJEXT)
+	-rm -f CodeTools/driver_cfa_cpp-TrackLoc.$(OBJEXT)
 	-rm -f Common/driver_cfa_cpp-Assert.$(OBJEXT)
 	-rm -f Common/driver_cfa_cpp-DebugMalloc.$(OBJEXT)
@@ -954,4 +959,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@CodeGen/$(DEPDIR)/driver_cfa_cpp-OperatorTable.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@CodeTools/$(DEPDIR)/driver_cfa_cpp-DeclStats.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@CodeTools/$(DEPDIR)/driver_cfa_cpp-TrackLoc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Assert.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-DebugMalloc.Po@am__quote@
@@ -1195,4 +1201,18 @@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o CodeTools/driver_cfa_cpp-DeclStats.obj `if test -f 'CodeTools/DeclStats.cc'; then $(CYGPATH_W) 'CodeTools/DeclStats.cc'; else $(CYGPATH_W) '$(srcdir)/CodeTools/DeclStats.cc'; fi`
 
+CodeTools/driver_cfa_cpp-TrackLoc.o: CodeTools/TrackLoc.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT CodeTools/driver_cfa_cpp-TrackLoc.o -MD -MP -MF CodeTools/$(DEPDIR)/driver_cfa_cpp-TrackLoc.Tpo -c -o CodeTools/driver_cfa_cpp-TrackLoc.o `test -f 'CodeTools/TrackLoc.cc' || echo '$(srcdir)/'`CodeTools/TrackLoc.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) CodeTools/$(DEPDIR)/driver_cfa_cpp-TrackLoc.Tpo CodeTools/$(DEPDIR)/driver_cfa_cpp-TrackLoc.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='CodeTools/TrackLoc.cc' object='CodeTools/driver_cfa_cpp-TrackLoc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o CodeTools/driver_cfa_cpp-TrackLoc.o `test -f 'CodeTools/TrackLoc.cc' || echo '$(srcdir)/'`CodeTools/TrackLoc.cc
+
+CodeTools/driver_cfa_cpp-TrackLoc.obj: CodeTools/TrackLoc.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT CodeTools/driver_cfa_cpp-TrackLoc.obj -MD -MP -MF CodeTools/$(DEPDIR)/driver_cfa_cpp-TrackLoc.Tpo -c -o CodeTools/driver_cfa_cpp-TrackLoc.obj `if test -f 'CodeTools/TrackLoc.cc'; then $(CYGPATH_W) 'CodeTools/TrackLoc.cc'; else $(CYGPATH_W) '$(srcdir)/CodeTools/TrackLoc.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) CodeTools/$(DEPDIR)/driver_cfa_cpp-TrackLoc.Tpo CodeTools/$(DEPDIR)/driver_cfa_cpp-TrackLoc.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='CodeTools/TrackLoc.cc' object='CodeTools/driver_cfa_cpp-TrackLoc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o CodeTools/driver_cfa_cpp-TrackLoc.obj `if test -f 'CodeTools/TrackLoc.cc'; then $(CYGPATH_W) 'CodeTools/TrackLoc.cc'; else $(CYGPATH_W) '$(srcdir)/CodeTools/TrackLoc.cc'; fi`
+
 Concurrency/driver_cfa_cpp-Keywords.o: Concurrency/Keywords.cc
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Concurrency/driver_cfa_cpp-Keywords.o -MD -MP -MF Concurrency/$(DEPDIR)/driver_cfa_cpp-Keywords.Tpo -c -o Concurrency/driver_cfa_cpp-Keywords.o `test -f 'Concurrency/Keywords.cc' || echo '$(srcdir)/'`Concurrency/Keywords.cc
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 1ed841f7e049323e1d8acd9b17df225ae010f2a5)
+++ src/Parser/parser.yy	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -393,4 +393,10 @@
 	| '(' compound_statement ')'						// GCC, lambda expression
 		{ $$ = new ExpressionNode( build_valexpr( $2 ) ); }
+	| primary_expression '{' argument_expression_list '}' // CFA
+		{
+			Token fn;
+			fn.str = new std::string( "?{}" );			// location undefined - use location of '{'?
+			$$ = new ExpressionNode( new ConstructorExpr( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 ) ) ) );
+		}
 	;
 
@@ -425,9 +431,9 @@
 	| '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99, compound-literal
 		{ $$ = new ExpressionNode( build_compoundLiteral( $2, new InitializerNode( $5, true ) ) ); }
-	| postfix_expression '{' argument_expression_list '}' // CFA
+	| '^' primary_expression '{' argument_expression_list '}' // CFA
 		{
 			Token fn;
-			fn.str = new std::string( "?{}" );			// location undefined - use location of '{'?
-			$$ = new ExpressionNode( new ConstructorExpr( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 ) ) ) );
+			fn.str = new string( "^?{}" );				// location undefined
+			$$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $2 )->set_last( $4 ) ) );
 		}
 	;
@@ -730,11 +736,4 @@
 	| exception_statement
 	| asm_statement
-	| '^' postfix_expression '{' argument_expression_list '}' ';' // CFA
-		{
-			Token fn;
-			fn.str = new string( "^?{}" );				// location undefined
-			$$ = new StatementNode( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $2 )->set_last( $4 ) ) ) ) );
-		}
-	;
 
 labeled_statement:
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 1ed841f7e049323e1d8acd9b17df225ae010f2a5)
+++ src/SymTab/Validate.cc	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -240,13 +240,13 @@
 		ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
 		acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
+		acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist
+		VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
 		Concurrency::applyKeywords( translationUnit );
 		autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecayPass
 		Concurrency::implementMutexFuncs( translationUnit );
 		Concurrency::implementThreadStarter( translationUnit );
-		acceptAll( translationUnit, epc );
 		ReturnChecker::checkFunctionReturns( translationUnit );
 		compoundliteral.mutateDeclarationList( translationUnit );
 		acceptAll( translationUnit, pass3 );
-		VerifyCtorDtorAssign::verify( translationUnit );
 		ArrayLength::computeLength( translationUnit );
 	}
@@ -817,5 +817,6 @@
 				throw SemanticError( "Constructors, destructors, and assignment functions require at least one parameter ", funcDecl );
 			}
-			if ( ! dynamic_cast< PointerType * >( params.front()->get_type() ) ) {
+			PointerType * ptrType = dynamic_cast< PointerType * >( params.front()->get_type() );
+			if ( ! ptrType || ptrType->is_array() ) {
 				throw SemanticError( "First parameter of a constructor, destructor, or assignment function must be a pointer ", funcDecl );
 			}
Index: src/SynTree/PointerType.cc
===================================================================
--- src/SynTree/PointerType.cc	(revision 1ed841f7e049323e1d8acd9b17df225ae010f2a5)
+++ src/SynTree/PointerType.cc	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// PointerType.cc -- 
+// PointerType.cc --
 //
 // Author           : Richard C. Bilson
@@ -38,14 +38,19 @@
 void PointerType::print( std::ostream &os, int indent ) const {
 	Type::print( os, indent );
-	os << "pointer to ";
-	if ( isStatic ) {
-		os << "static ";
-	} // if
-	if ( isVarLen ) {
-		os << "variable length array of ";
-	} else if ( dimension ) {
-		os << "array of ";
-		dimension->print( os, indent );
-	} // if
+	if ( ! is_array() ) {
+		os << "pointer to ";
+	} else {
+		os << "decayed ";
+		if ( isStatic ) {
+			os << "static ";
+		} // if
+		if ( isVarLen ) {
+			os << "variable length array of ";
+		} else if ( dimension ) {
+			os << "array of ";
+			dimension->print( os, indent );
+			os << " ";
+		} // if
+	}
 	if ( base ) {
 		base->print( os, indent );
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 1ed841f7e049323e1d8acd9b17df225ae010f2a5)
+++ src/SynTree/Type.h	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -247,4 +247,6 @@
 	void set_isStatic( bool newValue ) { isStatic = newValue; }
 
+	bool is_array() const { return isStatic || isVarLen || dimension; }
+
 	virtual PointerType *clone() const { return new PointerType( *this ); }
 	virtual void accept( Visitor & v ) { v.visit( this ); }
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 1ed841f7e049323e1d8acd9b17df225ae010f2a5)
+++ src/SynTree/Visitor.h	(revision b13fc108a7d023c62c89808e03c655be23485dfd)
@@ -9,6 +9,6 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb  9 14:23:24 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed May  3 08:58:00 2017
 // Update Count     : 10
 //
@@ -26,4 +26,7 @@
 	virtual ~Visitor();
   public:
+	// visit: Default implementation of all functions visits the children
+    // of the given syntax node, but performs no other action.
+
 	virtual void visit( ObjectDecl *objectDecl );
 	virtual void visit( FunctionDecl *functionDecl );
