Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 2d019af1e5dc0df0ad2bbe9c215b4c34968890c0)
+++ src/Parser/parser.yy	(revision 5e2595398be424f3bb962dc9113d737229f966bf)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 12 15:21:02 2021
-// Update Count     : 4728
+// Last Modified On : Mon Mar 15 13:34:17 2021
+// Update Count     : 4740
 //
 
@@ -1030,5 +1030,5 @@
 		{ $$ = new StatementNode( build_compound( (StatementNode *)0 ) ); }
 	| '{' push
-	  local_label_declaration_opt						// GCC, local labels
+	  local_label_declaration_opt						// GCC, local labels appear at start of block
 	  statement_decl_list								// C99, intermix declarations and statements
 	  pop '}'
@@ -1779,5 +1779,5 @@
 type_qualifier:
 	type_qualifier_name
-	| attribute
+	| attribute											// trick handles most atrribute locations
 	;
 
@@ -2649,7 +2649,5 @@
 		}
 	| ASM '(' string_literal ')' ';'					// GCC, global assembler statement
-		{
-			$$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) );
-		}
+		{ $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) ); }
 	| EXTERN STRINGliteral								// C++-style linkage specifier
 		{
@@ -2864,4 +2862,11 @@
 // declaring an array of functions versus a pointer to an array of functions.
 
+paren_identifier:
+	identifier
+		{ $$ = DeclarationNode::newName( $1 ); }
+	| '(' paren_identifier ')'							// redundant parenthesis
+		{ $$ = $2; }
+	;
+
 variable_declarator:
 	paren_identifier attribute_list_opt
@@ -2874,11 +2879,4 @@
 	;
 
-paren_identifier:
-	identifier
-		{ $$ = DeclarationNode::newName( $1 ); }
-	| '(' paren_identifier ')'							// redundant parenthesis
-		{ $$ = $2; }
-	;
-
 variable_ptr:
 	ptrref_operator variable_declarator
@@ -2886,6 +2884,8 @@
 	| ptrref_operator type_qualifier_list variable_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
-	| '(' variable_ptr ')' attribute_list_opt
-		{ $$ = $2->addQualifiers( $4 ); }				// redundant parenthesis
+	| '(' variable_ptr ')' attribute_list_opt			// redundant parenthesis
+		{ $$ = $2->addQualifiers( $4 ); }
+	| '(' attribute_list variable_ptr ')' attribute_list_opt // redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); }
 	;
 
@@ -2895,8 +2895,14 @@
 	| '(' variable_ptr ')' array_dimension
 		{ $$ = $2->addArray( $4 ); }
-	| '(' variable_array ')' multi_array_dimension		// redundant parenthesis
+	| '(' attribute_list variable_ptr ')' array_dimension
+		{ $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
+	| '(' variable_array ')' multi_array_dimension 		// redundant parenthesis
 		{ $$ = $2->addArray( $4 ); }
+	| '(' attribute_list variable_array ')' multi_array_dimension // redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
 	| '(' variable_array ')'							// redundant parenthesis
 		{ $$ = $2; }
+	| '(' attribute_list variable_array ')'				// redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -2904,6 +2910,10 @@
 	'(' variable_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $6 ); }
+	| '(' attribute_list variable_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
 	| '(' variable_function ')'							// redundant parenthesis
 		{ $$ = $2; }
+	| '(' attribute_list variable_function ')'			// redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -2925,6 +2935,10 @@
 	| '(' function_ptr ')' '(' push parameter_type_list_opt pop ')'
 		{ $$ = $2->addParamList( $6 ); }
+	| '(' attribute_list function_ptr ')' '(' push parameter_type_list_opt pop ')'
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
 	| '(' function_no_ptr ')'							// redundant parenthesis
 		{ $$ = $2; }
+	| '(' attribute_list function_no_ptr ')'			// redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -2934,6 +2948,8 @@
 	| ptrref_operator type_qualifier_list function_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
-	| '(' function_ptr ')'
-		{ $$ = $2; }
+	| '(' function_ptr ')' attribute_list_opt
+		{ $$ = $2->addQualifiers( $4 ); }
+	| '(' attribute_list function_ptr ')' attribute_list_opt
+		{ $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); }
 	;
 
@@ -2941,8 +2957,14 @@
 	'(' function_ptr ')' array_dimension
 		{ $$ = $2->addArray( $4 ); }
+	| '(' attribute_list function_ptr ')' array_dimension
+		{ $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
 	| '(' function_array ')' multi_array_dimension		// redundant parenthesis
 		{ $$ = $2->addArray( $4 ); }
+	| '(' attribute_list function_array ')' multi_array_dimension // redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
 	| '(' function_array ')'							// redundant parenthesis
 		{ $$ = $2; }
+	| '(' attribute_list function_array ')'				// redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -2965,6 +2987,10 @@
 	| '(' KR_function_ptr ')' '(' push parameter_type_list_opt pop ')'
 		{ $$ = $2->addParamList( $6 ); }
+	| '(' attribute_list KR_function_ptr ')' '(' push parameter_type_list_opt pop ')'
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
 	| '(' KR_function_no_ptr ')'						// redundant parenthesis
 		{ $$ = $2; }
+	| '(' attribute_list KR_function_no_ptr ')'			// redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -2976,4 +3002,6 @@
 	| '(' KR_function_ptr ')'
 		{ $$ = $2; }
+	| '(' attribute_list KR_function_ptr ')'
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -2981,8 +3009,14 @@
 	'(' KR_function_ptr ')' array_dimension
 		{ $$ = $2->addArray( $4 ); }
+	| '(' attribute_list KR_function_ptr ')' array_dimension
+		{ $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
 	| '(' KR_function_array ')' multi_array_dimension	// redundant parenthesis
 		{ $$ = $2->addArray( $4 ); }
+	| '(' attribute_list KR_function_array ')' multi_array_dimension // redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
 	| '(' KR_function_array ')'							// redundant parenthesis
 		{ $$ = $2; }
+	| '(' attribute_list KR_function_array ')'			// redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -2996,4 +3030,18 @@
 // The pattern precludes declaring an array of functions versus a pointer to an array of functions, and returning arrays
 // and functions versus pointers to arrays and functions.
+
+paren_type:
+	typedef
+		// hide type name in enclosing scope by variable name
+		{
+			// if ( ! typedefTable.existsCurr( *$1->name ) ) {
+				typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER, "ID" );
+			// } else {
+			// 	SemanticError( yylloc, string("'") + *$1->name + "' redeclared as different kind of symbol." ); $$ = nullptr;
+			// } // if
+		}
+	| '(' paren_type ')'
+		{ $$ = $2; }
+	;
 
 variable_type_redeclarator:
@@ -3007,18 +3055,4 @@
 	;
 
-paren_type:
-	typedef
-		// hide type name in enclosing scope by variable name
-		{
-			// if ( ! typedefTable.existsCurr( *$1->name ) ) {
-				typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER, "ID" );
-			// } else {
-			// 	SemanticError( yylloc, string("'") + *$1->name + "' redeclared as different kind of symbol." ); $$ = nullptr;
-			// } // if
-		}
-	| '(' paren_type ')'
-		{ $$ = $2; }
-	;
-
 type_ptr:
 	ptrref_operator variable_type_redeclarator
@@ -3026,6 +3060,8 @@
 	| ptrref_operator type_qualifier_list variable_type_redeclarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
-	| '(' type_ptr ')' attribute_list_opt
-		{ $$ = $2->addQualifiers( $4 ); }				// redundant parenthesis
+	| '(' type_ptr ')' attribute_list_opt				// redundant parenthesis
+		{ $$ = $2->addQualifiers( $4 ); }
+	| '(' attribute_list type_ptr ')' attribute_list_opt // redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); }
 	;
 
@@ -3035,8 +3071,14 @@
 	| '(' type_ptr ')' array_dimension
 		{ $$ = $2->addArray( $4 ); }
+	| '(' attribute_list type_ptr ')' array_dimension
+		{ $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
 	| '(' type_array ')' multi_array_dimension			// redundant parenthesis
 		{ $$ = $2->addArray( $4 ); }
+	| '(' attribute_list type_array ')' multi_array_dimension // redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
 	| '(' type_array ')'								// redundant parenthesis
 		{ $$ = $2; }
+	| '(' attribute_list type_array ')'					// redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -3046,6 +3088,10 @@
 	| '(' type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $6 ); }
+	| '(' attribute_list type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
 	| '(' type_function ')'								// redundant parenthesis
 		{ $$ = $2; }
+	| '(' attribute_list type_function ')'				// redundant parenthesis
+		{ $$ = $3->addQualifiers( $2 ); }
 	;
 
@@ -3072,5 +3118,5 @@
 	| ptrref_operator type_qualifier_list identifier_parameter_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
-	| '(' identifier_parameter_ptr ')' attribute_list_opt
+	| '(' identifier_parameter_ptr ')' attribute_list_opt // redundant parenthesis
 		{ $$ = $2->addQualifiers( $4 ); }
 	;
@@ -3129,5 +3175,5 @@
 	| ptrref_operator type_qualifier_list type_parameter_redeclarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
-	| '(' type_parameter_ptr ')' attribute_list_opt
+	| '(' type_parameter_ptr ')' attribute_list_opt		// redundant parenthesis
 		{ $$ = $2->addQualifiers( $4 ); }
 	;
@@ -3270,5 +3316,5 @@
 	| ptrref_operator type_qualifier_list abstract_parameter_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
-	| '(' abstract_parameter_ptr ')' attribute_list_opt
+	| '(' abstract_parameter_ptr ')' attribute_list_opt	// redundant parenthesis
 		{ $$ = $2->addQualifiers( $4 ); }
 	;
@@ -3349,5 +3395,5 @@
 	| ptrref_operator type_qualifier_list variable_abstract_declarator
 		{ $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
-	| '(' variable_abstract_ptr ')' attribute_list_opt
+	| '(' variable_abstract_ptr ')' attribute_list_opt	// redundant parenthesis
 		{ $$ = $2->addQualifiers( $4 ); }
 	;
