Index: src/Parser/TypedefTable.cc
===================================================================
--- src/Parser/TypedefTable.cc	(revision 132d276d12bea2c3a9678ed1adf52c3637091e41)
+++ src/Parser/TypedefTable.cc	(revision fc20514eea90ea2d9e7e72cd6a6a11c02dc1886f)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:20:13 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 22 06:14:39 2018
-// Update Count     : 206
+// Last Modified On : Wed Jul 11 11:47:47 2018
+// Update Count     : 255
 //
 
@@ -77,20 +77,18 @@
 	auto scope = kindTable.currentScope();
 	debugPrint( cerr << "Adding current at " << locn << " " << identifier << " as " << kindName( kind ) << " scope " << scope << endl );
-	auto ret = kindTable.insertAt( scope, identifier, kind );
-	//if ( ! ret.second ) ret.first->second = kind;		// exists => update
-	assert( ret.first->second == kind );				// exists
+	kindTable.insertAt( scope, identifier, kind );
 } // TypedefTable::addToScope
 
 void TypedefTable::addToEnclosingScope( const string & identifier, int kind, const char * locn __attribute__((unused)) ) {
-	assert( kindTable.currentScope() >= 1 + level );
-	auto scope = kindTable.currentScope() - 1 - level;
-	debugPrint( cerr << "Adding enclosing at " << locn << " " << identifier << " as " << kindName( kind ) << " scope " << scope << " level " << level << endl );
+	auto scope = kindTable.currentScope() - 1 - kindTable.getNote( kindTable.currentScope() - 1 ).level;
+//	auto scope = level - kindTable.getNote( kindTable.currentScope() - 1 ).level;
+	debugPrint( cerr << "Adding enclosing at " << locn << " " << identifier << " as " << kindName( kind ) << " scope " << scope << " level " << level << " note " << kindTable.getNote( kindTable.currentScope() - 1 ).level << endl );
 	auto ret = kindTable.insertAt( scope, identifier, kind );
-	if ( ! ret.second ) ret.first->second = kind;		// exists => update
+	if ( ! ret.second ) ret.first->second = kind;	// exists => update
 } // TypedefTable::addToEnclosingScope
 
 void TypedefTable::enterScope() {
-	kindTable.beginScope(0);
-	debugPrint( cerr << "Entering scope " << kindTable.currentScope() << endl; print() );
+	kindTable.beginScope( (Note){ 0, false } );
+	debugPrint( cerr << "Entering scope " << kindTable.currentScope() << " level " << level << endl; print() );
 } // TypedefTable::enterScope
 
@@ -100,11 +98,22 @@
 } // TypedefTable::leaveScope
 
+void TypedefTable::up( bool forall ) {
+	level += 1;
+	kindTable.getNote( kindTable.currentScope() ) = (Note){ level, forall | getEnclForall() };
+	debugPrint( cerr << "Up " << " level " << level << " note " << kindTable.getNote( level ).level << ", " << kindTable.getNote( level ).forall << endl; );
+} // TypedefTable::up
+
+void TypedefTable::down() {
+	level -= 1;
+	debugPrint( cerr << "Down " << " level " << level << " note " << kindTable.getNote( level ).level << endl; );
+} // TypedefTable::down
+
 void TypedefTable::print( void ) const {
 	KindTable::size_type scope = kindTable.currentScope();
-	debugPrint( cerr << "[" << scope << "]" );
+	debugPrint( cerr << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
 	for ( KindTable::const_iterator i = kindTable.begin(); i != kindTable.end(); i++ ) {
 		while ( i.get_level() != scope ) {
 			--scope;
-			debugPrint( cerr << endl << "[" << scope << "]" );
+			debugPrint( cerr << endl << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
 		} // while
 		debugPrint( cerr << " " << (*i).first << ":" << kindName( (*i).second ) );
@@ -112,5 +121,5 @@
 	while ( scope > 0 ) {
 		--scope;
-		debugPrint( cerr << endl << "[" << scope << "]" );
+		debugPrint( cerr << endl << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
 	} // while
 	debugPrint( cerr << endl );
Index: src/Parser/TypedefTable.h
===================================================================
--- src/Parser/TypedefTable.h	(revision 132d276d12bea2c3a9678ed1adf52c3637091e41)
+++ src/Parser/TypedefTable.h	(revision fc20514eea90ea2d9e7e72cd6a6a11c02dc1886f)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:24:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 22 05:29:58 2018
-// Update Count     : 86
+// Last Modified On : Tue Jul 10 18:32:23 2018
+// Update Count     : 112
 //
 
@@ -23,9 +23,9 @@
 
 class TypedefTable {
-	typedef ScopedMap< std::string, int, int > KindTable;
+	struct Note { size_t level; bool forall; };
+	typedef ScopedMap< std::string, int, Note > KindTable;
 	KindTable kindTable;	
-	unsigned int level;
+	unsigned int level = 0;
   public:
-    TypedefTable() : kindTable{0}, level{0} {}
 	~TypedefTable();
 
@@ -35,10 +35,11 @@
 	void addToScope( const std::string & identifier, int kind, const char * );
 	void addToEnclosingScope( const std::string & identifier, int kind, const char * );
+	bool getEnclForall() { return kindTable.getNote( kindTable.currentScope() -  1 ).forall; }
 
 	void enterScope();
 	void leaveScope();
 
-	void up() { level += 1; }
-	void down() { level -= 1; }
+	void up( bool );
+	void down();
 
 	void print( void ) const;
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 132d276d12bea2c3a9678ed1adf52c3637091e41)
+++ src/Parser/parser.yy	(revision fc20514eea90ea2d9e7e72cd6a6a11c02dc1886f)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul  6 08:02:38 2018
-// Update Count     : 3716
+// Last Modified On : Wed Jul 11 11:20:51 2018
+// Update Count     : 3738
 //
 
@@ -166,5 +166,5 @@
 } // build_postfix_name
 
-bool forall = false, xxx = false, yyy = false;			// aggregate have one or more forall qualifiers ?
+bool forall = false, yyy = false;						// aggregate have one or more forall qualifiers ?
 
 // https://www.gnu.org/software/bison/manual/bison.html#Location-Type
@@ -422,6 +422,10 @@
 //   Foo ( *fp )( int );
 //   `---'						matches start of TYPEGENname '('
-// Must be:
+// must be:
 //   Foo( int ) ( *fp )( int );
+// The same problem occurs here:
+//   forall( otype T ) struct Foo { T v; } ( *fp )( int );
+// must be:
+//   forall( otype T ) struct Foo { T v; } ( int ) ( *fp )( int );
 
 // Order of these lines matters (low-to-high precedence).
@@ -1856,9 +1860,11 @@
 
 aggregate_type:											// struct, union
-	aggregate_key attribute_list_opt '{' field_declaration_list_opt '}' type_parameters_opt
-		{ $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $6, $4, true )->addQualifiers( $2 ); }
+	aggregate_key attribute_list_opt
+		{ forall = false; }								// reset
+	  '{' field_declaration_list_opt '}' type_parameters_opt
+		{ $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $7, $5, true )->addQualifiers( $2 ); }
 	| aggregate_key attribute_list_opt no_attr_identifier fred
 		{
-			typedefTable.makeTypedef( *$3, forall ? TYPEGENname : TYPEDEFname ); // create typedef
+			typedefTable.makeTypedef( *$3, forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef
 			forall = false;								// reset
 		}
@@ -1867,5 +1873,5 @@
 	| aggregate_key attribute_list_opt type_name fred
 		{
-			typedefTable.makeTypedef( *$3->type->symbolic.name, forall ? TYPEGENname : TYPEDEFname ); // create typedef
+			typedefTable.makeTypedef( *$3->type->symbolic.name, forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef
 			forall = false;								// reset
 		}
@@ -1885,5 +1891,5 @@
 	aggregate_key attribute_list_opt no_attr_identifier fred
 		{
-			typedefTable.makeTypedef( *$3, forall ? TYPEGENname : TYPEDEFname );
+			typedefTable.makeTypedef( *$3, forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname );
 			forall = false;								// reset
 			$$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 );
@@ -1891,4 +1897,5 @@
 	| aggregate_key attribute_list_opt type_name fred
 		{
+			forall = false;								// reset
 			// Create new generic declaration with same name as previous forward declaration, where the IDENTIFIER is
 			// switched to a TYPEGENname. Link any generic arguments from typegen_name to new generic declaration and
@@ -2366,8 +2373,6 @@
 	push external_definition pop
 		{ $$ = $2; }
-	| external_definition_list
-		{ forall = xxx; }
-	  push external_definition pop
-		{ $$ = $1 ? $1->appendList( $4 ) : $4; }
+	| external_definition_list push external_definition pop
+		{ $$ = $1 ? $1->appendList( $3 ) : $3; }
 	;
 
@@ -2379,5 +2384,5 @@
 
 up:
-		{ typedefTable.up(); }
+		{ typedefTable.up( forall ); forall = false; }
 	;
 
@@ -2412,10 +2417,10 @@
 		{
 			if ( $1->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
-			if ( $1->type->forall ) xxx = forall = true; // remember generic type
+			if ( $1->type->forall ) forall = true;		// remember generic type
 		}
 	  '{' up external_definition_list_opt down '}'		// CFA, namespace
 		{
 			distQual( $5, $1 );
- 			xxx = false;
+ 			forall = false;
 			$$ = $5;
 		}
@@ -2423,10 +2428,10 @@
 		{
 			if ( $1->type && $1->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
-			if ( $1->type && $1->type->forall ) xxx = forall = true; // remember generic type
+			if ( $1->type && $1->type->forall ) forall = true; // remember generic type
 		}
 	  '{' up external_definition_list_opt down '}'		// CFA, namespace
 		{
 			distQual( $5, $1 );
- 			xxx = false;
+ 			forall = false;
 			$$ = $5;
 		}
@@ -2434,10 +2439,10 @@
 		{
 			if ( ($1->type && $1->type->qualifiers.val) || $2->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
-			if ( ($1->type && $1->type->forall) || $2->type->forall ) xxx = forall = true; // remember generic type
+			if ( ($1->type && $1->type->forall) || $2->type->forall ) forall = true; // remember generic type
 		}
 	  '{' up external_definition_list_opt down '}'		// CFA, namespace
 		{
 			distQual( $6, $1->addQualifiers( $2 ) );
- 			xxx = false;
+ 			forall = false;
 			$$ = $6;
 		}
