Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/Parser/DeclarationNode.cc	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 25 17:13:06 2019
-// Update Count     : 1115
+// Last Modified On : Thu Jul 25 22:17:10 2019
+// Update Count     : 1116
 //
 
@@ -418,22 +418,4 @@
 	return newnode;
 } // DeclarationNode::newBuiltinType
-
-DeclarationNode * DeclarationNode::newAttr( const string * name, ExpressionNode * expr ) {
-	DeclarationNode * newnode = new DeclarationNode;
-	newnode->type = nullptr;
-//	newnode->attr.name = name;
-	newnode->name = name;
-	newnode->attr.expr = expr;
-	return newnode;
-}
-
-DeclarationNode * DeclarationNode::newAttr( const string * name, DeclarationNode * type ) {
-	DeclarationNode * newnode = new DeclarationNode;
-	newnode->type = nullptr;
-//	newnode->attr.name = name;
-	newnode->name = name;
-	newnode->attr.type = type;
-	return newnode;
-}
 
 DeclarationNode * DeclarationNode::newAttribute( const string * name, ExpressionNode * expr ) {
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/Parser/ParseNode.h	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 25 15:49:51 2019
-// Update Count     : 875
+// Last Modified On : Thu Jul 25 22:17:10 2019
+// Update Count     : 876
 //
 
@@ -252,6 +252,4 @@
 	static DeclarationNode * newTuple( DeclarationNode * members );
 	static DeclarationNode * newTypeof( ExpressionNode * expr, bool basetypeof = false );
-	static DeclarationNode * newAttr( const std::string *, ExpressionNode * expr ); // @ attributes
-	static DeclarationNode * newAttr( const std::string *, DeclarationNode * type ); // @ attributes
 	static DeclarationNode * newAttribute( const std::string *, ExpressionNode * expr = nullptr ); // gcc attributes
 	static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/Parser/lex.ll	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Thu Jul 25 15:46:05 2019
- * Update Count     : 715
+ * Last Modified On : Thu Jul 25 22:08:32 2019
+ * Update Count     : 716
  */
 
@@ -59,5 +59,4 @@
 #define QKEYWORD_RETURN(x)	RETURN_VAL(x);				// quasi-keyword
 #define IDENTIFIER_RETURN()	RETURN_VAL( typedefTable.isKind( yytext ) )
-#define ATTRIBUTE_RETURN()	RETURN_VAL( ATTR_IDENTIFIER )
 
 #ifdef HAVE_KEYWORDS_FLOATXX								// GCC >= 7 => keyword, otherwise typedef
@@ -92,7 +91,4 @@
 				// identifier, GCC: $ in identifier
 identifier ([a-zA-Z_$]|{universal_char})([0-9a-zA-Z_$]|{universal_char})*
-
-				// attribute identifier, GCC: $ in identifier
-attr_identifier "@"{identifier}
 
 				// numeric constants, CFA: '_' in constant
@@ -336,5 +332,4 @@
 	IDENTIFIER_RETURN();
 }
-{attr_identifier} { ATTRIBUTE_RETURN(); }
 
 				/* numeric constants */
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/Parser/parser.yy	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 25 15:49:52 2019
-// Update Count     : 4356
+// Last Modified On : Thu Jul 25 22:31:38 2019
+// Update Count     : 4359
 //
 
@@ -289,5 +289,4 @@
 %token<tok> IDENTIFIER			QUOTED_IDENTIFIER		TYPEDEFname				TYPEGENname
 %token<tok> TIMEOUT				WOR
-%token<tok> ATTR_IDENTIFIER		ATTR_TYPEDEFname		ATTR_TYPEGENname
 %token<tok> INTEGERconstant		CHARACTERconstant		STRINGliteral
 %token<tok> DIRECTIVE
@@ -313,6 +312,6 @@
 %token ATassign											// @=
 
-%type<tok> identifier  no_attr_identifier
-%type<tok> identifier_or_type_name  no_attr_identifier_or_type_name  attr_name
+%type<tok> identifier
+%type<tok> identifier_or_type_name  attr_name
 %type<tok> quasi_keyword
 %type<constant> string_literal
@@ -547,14 +546,9 @@
 	;
 
-no_attr_identifier:
+identifier:
 	IDENTIFIER
 	| quasi_keyword
 	| '@'												// CFA
 		{ Token tok = { new string( DeclarationNode::anonymous.newName() ), yylval.tok.loc }; $$ = tok; }
-	;
-
-identifier:
-	no_attr_identifier
-	| ATTR_IDENTIFIER									// CFA
 	;
 
@@ -595,5 +589,5 @@
 	| '(' comma_expression ')' '`' IDENTIFIER			// CFA, postfix call
 		{ $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $5 ) ), $2 ) ); }
-	| type_name '.' no_attr_identifier					// CFA, nested type
+	| type_name '.' identifier							// CFA, nested type
 		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
 	| type_name '.' '[' field_name_list ']'				// CFA, nested type / tuple field selector
@@ -648,5 +642,5 @@
 	| postfix_expression '(' argument_expression_list ')'
 		{ $$ = new ExpressionNode( build_func( $1, $3 ) ); }
-	| postfix_expression '.' no_attr_identifier
+	| postfix_expression '.' identifier
 		{ $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); }
 	| postfix_expression '.' INTEGERconstant			// CFA, tuple index
@@ -656,5 +650,5 @@
 	| postfix_expression '.' '[' field_name_list ']'	// CFA, tuple field selector
 		{ $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $4 ) ) ); }
-	| postfix_expression ARROW no_attr_identifier
+	| postfix_expression ARROW identifier
 		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); }
 	| postfix_expression ARROW INTEGERconstant			// CFA, tuple index
@@ -719,5 +713,5 @@
 	| FLOATINGconstant fraction_constants_opt
 		{ $$ = new ExpressionNode( build_field_name_fraction_constants( build_field_name_FLOATINGconstant( *$1 ), $2 ) ); }
-	| no_attr_identifier fraction_constants_opt
+	| identifier fraction_constants_opt
 		{
 			$$ = new ExpressionNode( build_field_name_fraction_constants( build_varref( $1 ), $2 ) );
@@ -777,12 +771,6 @@
 	| ALIGNOF '(' type_no_function ')'					// GCC, type alignment
 		{ $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuildType( $3 ) ) ); }
-	| OFFSETOF '(' type_no_function ',' no_attr_identifier ')'
+	| OFFSETOF '(' type_no_function ',' identifier ')'
 		{ $$ = new ExpressionNode( build_offsetOf( $3, build_varref( $5 ) ) ); }
-	| ATTR_IDENTIFIER
-		{ $$ = new ExpressionNode( new AttrExpr( build_varref( $1 ), maybeMoveBuild< Expression >( (ExpressionNode *)nullptr ) ) ); }
-	| ATTR_IDENTIFIER '(' argument_expression ')'
-		{ $$ = new ExpressionNode( new AttrExpr( build_varref( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); }
-	| ATTR_IDENTIFIER '(' type ')'
-		{ $$ = new ExpressionNode( new AttrExpr( build_varref( $1 ), maybeMoveBuildType( $3 ) ) ); }
 	;
 
@@ -1019,5 +1007,5 @@
 
 labeled_statement:
-		// labels cannot be identifiers 0 or 1 or ATTR_IDENTIFIER
+		// labels cannot be identifiers 0 or 1
 	identifier_or_type_name ':' attribute_list_opt statement
 		{ $$ = $4->add_label( $1, $3 ); }
@@ -1387,5 +1375,5 @@
 	| type_specifier_nobody variable_abstract_declarator
 		{ $$ = $2->addType( $1 ); }
-	| cfa_abstract_declarator_tuple no_attr_identifier	// CFA
+	| cfa_abstract_declarator_tuple identifier			// CFA
 		{ $$ = $1->addName( $2 ); }
 	| cfa_abstract_declarator_tuple						// CFA
@@ -1451,10 +1439,10 @@
 
 label_list:
-	no_attr_identifier
+	identifier
 		{
 			$$ = new LabelNode(); $$->labels.push_back( *$1 );
 			delete $1;									// allocated by lexer
 		}
-	| label_list ',' no_attr_identifier
+	| label_list ',' identifier
 		{
 			$$ = $1; $1->labels.push_back( *$3 );
@@ -1501,6 +1489,6 @@
 
 local_label_list:										// GCC, local label
-	no_attr_identifier_or_type_name
-	| local_label_list ',' no_attr_identifier_or_type_name
+	identifier_or_type_name
+	| local_label_list ',' identifier_or_type_name
 	;
 
@@ -1624,5 +1612,5 @@
 			$$ = $2->addTypedef();
 		}
-	| cfa_typedef_declaration pop ',' push no_attr_identifier
+	| cfa_typedef_declaration pop ',' push identifier
 		{
 			typedefTable.addToEnclosingScope( *$5, TYPEDEFname, "3" );
@@ -1664,10 +1652,10 @@
 typedef_expression:
 		// GCC, naming expression type: typedef name = exp; gives a name to the type of an expression
-	TYPEDEF no_attr_identifier '=' assignment_expression
+	TYPEDEF identifier '=' assignment_expression
 		{
 			// $$ = DeclarationNode::newName( 0 );			// unimplemented
 			SemanticError( yylloc, "Typedef expression is currently unimplemented." ); $$ = nullptr;
 		}
-	| typedef_expression pop ',' push no_attr_identifier '=' assignment_expression
+	| typedef_expression pop ',' push identifier '=' assignment_expression
 		{
 			// $$ = DeclarationNode::newName( 0 );			// unimplemented
@@ -1915,8 +1903,4 @@
 	| BASETYPEOF '(' comma_expression ')'				// CFA: basetypeof( a+b ) y;
 		{ $$ = DeclarationNode::newTypeof( $3, true ); }
-	| ATTR_TYPEGENname '(' type ')'						// CFA: e.g., @type( x ) y;
-		{ $$ = DeclarationNode::newAttr( $1, $3 ); }
-	| ATTR_TYPEGENname '(' comma_expression ')'			// CFA: e.g., @type( a+b ) y;
-		{ $$ = DeclarationNode::newAttr( $1, $3 ); }
 	| ZERO_T											// CFA
 		{ $$ = DeclarationNode::newBuiltinType( DeclarationNode::Zero ); }
@@ -2027,5 +2011,5 @@
 	  '{' field_declaration_list_opt '}' type_parameters_opt
 		{ $$ = DeclarationNode::newAggregate( $1, nullptr, $7, $5, true )->addQualifiers( $2 ); }
-	| aggregate_key attribute_list_opt no_attr_identifier fred
+	| aggregate_key attribute_list_opt identifier fred
 		{
 			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef
@@ -2053,5 +2037,5 @@
 
 aggregate_type_nobody:									// struct, union - {...}
-	aggregate_key attribute_list_opt no_attr_identifier fred
+	aggregate_key attribute_list_opt identifier fred
 		{
 			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname );
@@ -2154,7 +2138,7 @@
 cfa_field_declaring_list:								// CFA, new style field declaration
 	// bit-fields are handled by C declarations
-	cfa_abstract_declarator_tuple no_attr_identifier_or_type_name
+	cfa_abstract_declarator_tuple identifier_or_type_name
 		{ $$ = $1->addName( $2 ); }
-	| cfa_field_declaring_list ',' no_attr_identifier_or_type_name
+	| cfa_field_declaring_list ',' identifier_or_type_name
 		{ $$ = $1->appendList( $1->cloneType( $3 ) ); }
 	;
@@ -2181,5 +2165,5 @@
 	ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
 		{ $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); }
-	| ENUM attribute_list_opt no_attr_identifier
+	| ENUM attribute_list_opt identifier
 		{ typedefTable.makeTypedef( *$3 ); }
 	  '{' enumerator_list comma_opt '}'
@@ -2192,5 +2176,5 @@
 
 enum_type_nobody:										// enum - {...}
-	ENUM attribute_list_opt no_attr_identifier
+	ENUM attribute_list_opt identifier
 		{
 			typedefTable.makeTypedef( *$3 );
@@ -2205,7 +2189,7 @@
 
 enumerator_list:
-	no_attr_identifier_or_type_name enumerator_value_opt
+	identifier_or_type_name enumerator_value_opt
 		{ $$ = DeclarationNode::newEnumConstant( $1, $2 ); }
-	| enumerator_list ',' no_attr_identifier_or_type_name enumerator_value_opt
+	| enumerator_list ',' identifier_or_type_name enumerator_value_opt
 		{ $$ = $1->appendList( DeclarationNode::newEnumConstant( $3, $4 ) ); }
 	;
@@ -2315,7 +2299,7 @@
 
 identifier_list:										// K&R-style parameter list => no types
-	no_attr_identifier
+	identifier
 		{ $$ = DeclarationNode::newName( $1 ); }
-	| identifier_list ',' no_attr_identifier
+	| identifier_list ',' identifier
 		{ $$ = $1->appendList( DeclarationNode::newName( $3 ) ); }
 	;
@@ -2323,10 +2307,4 @@
 identifier_or_type_name:
 	identifier
-	| TYPEDEFname
-	| TYPEGENname
-	;
-
-no_attr_identifier_or_type_name:
-	no_attr_identifier
 	| TYPEDEFname
 	| TYPEGENname
@@ -2383,5 +2361,5 @@
 designation:
 	designator_list ':'									// C99, CFA uses ":" instead of "="
-	| no_attr_identifier ':'							// GCC, field name
+	| identifier ':'									// GCC, field name
 		{ $$ = new ExpressionNode( build_varref( $1 ) ); }
 	;
@@ -2395,5 +2373,5 @@
 
 designator:
-	'.' no_attr_identifier								// C99, field name
+	'.' identifier										// C99, field name
 		{ $$ = new ExpressionNode( build_varref( $2 ) ); }
 	| '[' push assignment_expression pop ']'			// C99, single array element
@@ -2440,5 +2418,5 @@
 
 type_parameter:											// CFA
-	type_class no_attr_identifier_or_type_name
+	type_class identifier_or_type_name
 		{ typedefTable.addToScope( *$2, TYPEDEFname, "9" ); }
 	  type_initializer_opt assertion_list_opt
@@ -2473,5 +2451,5 @@
 
 assertion:												// CFA
-	'|' no_attr_identifier_or_type_name '(' type_list ')'
+	'|' identifier_or_type_name '(' type_list ')'
 		{ $$ = DeclarationNode::newTraitUse( $2, $4 ); }
 	| '|' '{' push trait_declaration_list pop '}'
@@ -2510,10 +2488,10 @@
 
 type_declarator_name:									// CFA
-	no_attr_identifier_or_type_name
+	identifier_or_type_name
 		{
 			typedefTable.addToEnclosingScope( *$1, TYPEDEFname, "10" );
 			$$ = DeclarationNode::newTypeDecl( $1, 0 );
 		}
-	| no_attr_identifier_or_type_name '(' type_parameter_list ')'
+	| identifier_or_type_name '(' type_parameter_list ')'
 		{
 			typedefTable.addToEnclosingScope( *$1, TYPEGENname, "11" );
@@ -2523,7 +2501,7 @@
 
 trait_specifier:										// CFA
-	TRAIT no_attr_identifier_or_type_name '(' type_parameter_list ')' '{' '}'
+	TRAIT identifier_or_type_name '(' type_parameter_list ')' '{' '}'
 		{ $$ = DeclarationNode::newTrait( $2, $4, 0 ); }
-	| TRAIT no_attr_identifier_or_type_name '(' type_parameter_list ')' '{' push trait_declaration_list pop '}'
+	| TRAIT identifier_or_type_name '(' type_parameter_list ')' '{' push trait_declaration_list pop '}'
 		{ $$ = DeclarationNode::newTrait( $2, $4, $8 ); }
 	;
