Index: amples/Attributes.c
===================================================================
--- examples/Attributes.c	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ 	(revision )
@@ -1,92 +1,0 @@
-// I Compile-time resolution
-// =========================
-// 
-// 1. an isolated name, where the argument is implicitly determined by the result context
-// 
-//    @max
-// 
-// 2. a direct application to a manifest otype
-// 
-//    @max( int )
-// 
-// 3. constraining a otype variable; the application is implicitly performed at the call site as in (2)
-// 
-//    forall( otype T | { T @max( T ); } ) T x( T t );
-// 
-// 
-// II Run-time resolution
-// ======================
-// 
-// 1. an indirect reference, where the argument is implicitly determined by the result context
-// 
-//    attr_var = &@max;
-//    x = (*attr_var);
-// 
-// 2. an indirect application to a manifest otype
-// 
-//    (*attr_var)( int )
-// 
-// 3. a direct application to a otype variable
-// 
-//    @max( T )
-// 
-// Under what circumstances can this be done at compile/link time?
-// 
-// 
-// III Declaration forms
-// =====================
-// 
-// 1. monomorphic with implicit argument
-// 
-//    int @max;
-// 
-// 2. monomorphic with explicit argument
-// 
-//    int @max( int );
-// 
-// 3. polymorphic
-// 
-//    forall( otype T | constraint( T ) ) int @attr( T );
-
-int @max = 3;
-
-int main() {
-    int x;
-    otype @otype(otype t);									// compiler intrinsic
-    otype @widest(otype t);
-    @otype(x) *y;										// gcc: otypeof(x) *y;
-//    const @widest(double) *w;							// gcc: const otypeof(x) *w;
-//    * @otype(3 + 4) z;									// cfa declaration syntax
-    y = @max;		
-    z = @max(x) + @size(int);
-    y = @min(3 + 4);
-    if ( @const(x) ) { }
-    if ( @volatile(y) ) { }
-    if ( @extern(y) ) { }
-    if ( @static(y) ) { }
-    @max;
-}
-
-int @foo(int) {
-    return 7;
-}
-
-int @voon;
-double @voon;
-
-int @bort(int);
-int @bort(double);
-
-void g( int );
-
-void f() {
-	float x;
-	double x;
-	@bort(x);
-	@bort(int);
-	g( @voon );
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// End: //
Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/AST/Convert.cpp	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -9,7 +9,7 @@
 // Author           : Thierry Delisle
 // Created On       : Thu May 09 15::37::05 2019
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Jun 17 16:44:00 2019
-// Update Count     : 12
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Jul 25 22:21:46 2019
+// Update Count     : 13
 //
 
@@ -2676,8 +2676,4 @@
 		);
 	}
-
-	virtual void visit( const AttrExpr * ) override final {
-		assertf( false, "AttrExpr deprecated in new AST." );
-	}
 };
 
Index: src/AST/porting.md
===================================================================
--- src/AST/porting.md	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/AST/porting.md	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -171,7 +171,4 @@
   * all existing uses assume `type` set if true and don't use `expr`
 
-`AttrExpr`
-* did not port due to feature deprecation (e.g. `expr@attribute`)
-
 `LogicalExpr`
 * un-defaulted constructor parameter determining `&&` or `||`
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/Common/PassVisitor.h	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -155,6 +155,4 @@
 	virtual void visit( OffsetPackExpr * offsetPackExpr ) override final;
 	virtual void visit( const OffsetPackExpr * offsetPackExpr ) override final;
-	virtual void visit( AttrExpr * attrExpr ) override final;
-	virtual void visit( const AttrExpr * attrExpr ) override final;
 	virtual void visit( LogicalExpr * logicalExpr ) override final;
 	virtual void visit( const LogicalExpr * logicalExpr ) override final;
@@ -301,5 +299,4 @@
 	virtual Expression * mutate( OffsetofExpr * offsetofExpr ) override final;
 	virtual Expression * mutate( OffsetPackExpr * offsetPackExpr ) override final;
-	virtual Expression * mutate( AttrExpr * attrExpr ) override final;
 	virtual Expression * mutate( LogicalExpr * logicalExpr ) override final;
 	virtual Expression * mutate( ConditionalExpr * conditionalExpr ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/Common/PassVisitor.impl.h	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -2302,49 +2302,4 @@
 
 //--------------------------------------------------------------------------
-// AttrExpr
-template< typename pass_type >
-void PassVisitor< pass_type >::visit( AttrExpr * node ) {
-	VISIT_START( node );
-
-	indexerScopedAccept( node->result, *this );
-	if ( node->get_isType() ) {
-		maybeAccept_impl( node->type, *this );
-	} else {
-		maybeAccept_impl( node->expr, *this );
-	}
-
-	VISIT_END( node );
-}
-
-template< typename pass_type >
-void PassVisitor< pass_type >::visit( const AttrExpr * node ) {
-	VISIT_START( node );
-
-	indexerScopedAccept( node->result, *this );
-	if ( node->get_isType() ) {
-		maybeAccept_impl( node->type, *this );
-	} else {
-		maybeAccept_impl( node->expr, *this );
-	}
-
-	VISIT_END( node );
-}
-
-template< typename pass_type >
-Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) {
-	MUTATE_START( node );
-
-	indexerScopedMutate( node->env   , *this );
-	indexerScopedMutate( node->result, *this );
-	if ( node->get_isType() ) {
-		maybeMutate_impl( node->type, *this );
-	} else {
-		maybeMutate_impl( node->expr, *this );
-	}
-
-	MUTATE_END( Expression, node );
-}
-
-//--------------------------------------------------------------------------
 // LogicalExpr
 template< typename pass_type >
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/InitTweak/InitTweak.cc	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Fri May 13 11:26:36 2016
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Jun 19 14:34:00 2019
-// Update Count     : 6
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Jul 25 22:21:48 2019
+// Update Count     : 7
 //
 
@@ -957,5 +957,4 @@
 		void previsit( OffsetofExpr * ) {}
 		void previsit( OffsetPackExpr * ) {}
-		void previsit( AttrExpr * ) {}
 		void previsit( CommaExpr * ) {}
 		void previsit( LogicalExpr * ) {}
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 ); }
 	;
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 23:52:08 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov  1 21:00:56 2018
-// Update Count     : 35
+// Last Modified On : Thu Jul 25 22:37:46 2019
+// Update Count     : 37
 //
 
@@ -79,5 +79,4 @@
 		void postvisit( OffsetofExpr * offsetofExpr );
 		void postvisit( OffsetPackExpr * offsetPackExpr );
-		void postvisit( AttrExpr * attrExpr );
 		void postvisit( LogicalExpr * logicalExpr );
 		void postvisit( ConditionalExpr * conditionalExpr );
@@ -1404,69 +1403,4 @@
 	}
 
-	namespace {
-		void resolveAttr( SymTab::Indexer::IdData data, const FunctionType * function, Type * argType, const TypeEnvironment &env, AlternativeFinder & finder ) {
-			// assume no polymorphism
-			// assume no implicit conversions
-			assert( function->parameters.size() == 1 );
-			PRINT(
-				std::cerr << "resolvAttr: funcDecl is ";
-				data.id->print( std::cerr );
-				std::cerr << " argType is ";
-				argType->print( std::cerr );
-				std::cerr << std::endl;
-			)
-			const SymTab::Indexer & indexer = finder.get_indexer();
-			AltList & alternatives = finder.get_alternatives();
-			if ( typesCompatibleIgnoreQualifiers( argType, function->parameters.front()->get_type(), indexer, env ) ) {
-				Cost cost = Cost::zero;
-				Expression * newExpr = data.combine( cost );
-				alternatives.push_back( Alternative{
-					new AttrExpr{ newExpr, argType->clone() }, env, OpenVarSet{},
-					AssertionList{}, Cost::zero, cost } );
-				for ( DeclarationWithType * retVal : function->returnVals ) {
-					alternatives.back().expr->result = retVal->get_type()->clone();
-				} // for
-			} // if
-		}
-	}
-
-	void AlternativeFinder::Finder::postvisit( AttrExpr * attrExpr ) {
-		// assume no 'pointer-to-attribute'
-		NameExpr * nameExpr = dynamic_cast< NameExpr* >( attrExpr->get_attr() );
-		assert( nameExpr );
-		std::list< SymTab::Indexer::IdData > attrList;
-		indexer.lookupId( nameExpr->get_name(), attrList );
-		if ( attrExpr->get_isType() || attrExpr->get_expr() ) {
-			for ( auto & data : attrList ) {
-				const DeclarationWithType * id = data.id;
-				// check if the type is function
-				if ( const FunctionType * function = dynamic_cast< const FunctionType * >( id->get_type() ) ) {
-					// assume exactly one parameter
-					if ( function->parameters.size() == 1 ) {
-						if ( attrExpr->get_isType() ) {
-							resolveAttr( data, function, attrExpr->get_type(), env, altFinder);
-						} else {
-							AlternativeFinder finder( indexer, env );
-							finder.find( attrExpr->get_expr() );
-							for ( AltList::iterator choice = finder.alternatives.begin(); choice != finder.alternatives.end(); ++choice ) {
-								if ( choice->expr->get_result()->size() == 1 ) {
-									resolveAttr(data, function, choice->expr->get_result(), choice->env, altFinder );
-								} // fi
-							} // for
-						} // if
-					} // if
-				} // if
-			} // for
-		} else {
-			for ( auto & data : attrList ) {
-				Cost cost = Cost::zero;
-				Expression * newExpr = data.combine( cost );
-				alternatives.push_back( Alternative{
-					newExpr, env, OpenVarSet{}, AssertionList{}, Cost::zero, cost } );
-				renameTypes( alternatives.back().expr );
-			} // for
-		} // if
-	}
-
 	void AlternativeFinder::Finder::postvisit( LogicalExpr * logicalExpr ) {
 		AlternativeFinder firstFinder( indexer, env );
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/SynTree/Expression.cc	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Feb 19 18:10:55 2019
-// Update Count     : 60
+// Last Modified On : Thu Jul 25 22:21:48 2019
+// Update Count     : 61
 //
 
@@ -249,33 +249,4 @@
 	os << "Offset pack expression on ";
 	type->print(os, indent+1);
-	Expression::print( os, indent );
-}
-
-AttrExpr::AttrExpr( Expression * attr, Expression * expr_ ) :
-		Expression(), attr( attr ), expr(expr_), type(0), isType(false) {
-}
-
-AttrExpr::AttrExpr( Expression * attr, Type * type_ ) :
-		Expression(), attr( attr ), expr(0), type(type_), isType(true) {
-}
-
-AttrExpr::AttrExpr( const AttrExpr & other ) :
-		Expression( other ), attr( maybeClone( other.attr ) ), expr( maybeClone( other.expr ) ), type( maybeClone( other.type ) ), isType( other.isType ) {
-}
-
-AttrExpr::~AttrExpr() {
-	delete attr;
-	delete expr;
-	delete type;
-}
-
-void AttrExpr::print( std::ostream & os, Indenter indent) const {
-	os << "Attr ";
-	attr->print( os, indent+1);
-	if ( isType || expr ) {
-		os << "applied to: ";
-		if (isType) type->print(os, indent+1);
-		else expr->print(os, indent+1);
-	} // if
 	Expression::print( os, indent );
 }
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/SynTree/Expression.h	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Feb 18 18:29:51 2019
-// Update Count     : 49
+// Last Modified On : Thu Jul 25 22:21:44 2019
+// Update Count     : 50
 //
 
@@ -463,33 +463,4 @@
 };
 
-/// AttrExpr represents an @attribute expression (like sizeof, but user-defined)
-class AttrExpr : public Expression {
-  public:
-	Expression * attr;
-	Expression * expr;
-	Type * type;
-	bool isType;
-
-	AttrExpr(Expression * attr, Expression * expr );
-	AttrExpr( const AttrExpr & other );
-	AttrExpr( Expression * attr, Type * type );
-	virtual ~AttrExpr();
-
-	Expression * get_attr() const { return attr; }
-	void set_attr( Expression * newValue ) { attr = newValue; }
-	Expression * get_expr() const { return expr; }
-	void set_expr( Expression * newValue ) { expr = newValue; }
-	Type * get_type() const { return type; }
-	void set_type( Type * newValue ) { type = newValue; }
-	bool get_isType() const { return isType; }
-	void set_isType( bool newValue ) { isType = newValue; }
-
-	virtual AttrExpr * clone() const override { return new AttrExpr( * this ); }
-	virtual void accept( Visitor & v ) override { v.visit( this ); }
-	virtual void accept( Visitor & v ) const override { v.visit( this ); }
-	virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); }
-	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
-};
-
 /// LogicalExpr represents a short-circuit boolean expression (&& or ||)
 class LogicalExpr : public Expression {
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/SynTree/Mutator.h	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Jul 24 16:31:00 2017
-// Update Count     : 16
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Jul 25 22:37:46 2019
+// Update Count     : 17
 //
 #pragma once
@@ -74,5 +74,4 @@
 	virtual Expression * mutate( OffsetofExpr * offsetofExpr ) = 0;
 	virtual Expression * mutate( OffsetPackExpr * offsetPackExpr ) = 0;
-	virtual Expression * mutate( AttrExpr * attrExpr ) = 0;
 	virtual Expression * mutate( LogicalExpr * logicalExpr ) = 0;
 	virtual Expression * mutate( ConditionalExpr * conditionalExpr ) = 0;
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/SynTree/SynTree.h	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Jul 24 16:54:00 2017
-// Update Count     : 11
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Jul 25 22:37:45 2019
+// Update Count     : 12
 //
 
@@ -79,5 +79,4 @@
 class OffsetofExpr;
 class OffsetPackExpr;
-class AttrExpr;
 class LogicalExpr;
 class ConditionalExpr;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision f673c13c3abea6ddbff21862943f7b63b949ff46)
+++ src/SynTree/Visitor.h	(revision 033ff3711d4010b2ccdeb4a02f5a7a01b1512ca6)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Jul 24 16:28:00 2017
-// Update Count     : 13
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Jul 25 22:21:49 2019
+// Update Count     : 14
 //
 
@@ -123,6 +123,4 @@
 	virtual void visit( OffsetPackExpr * node ) { visit( const_cast<const OffsetPackExpr *>(node) ); }
 	virtual void visit( const OffsetPackExpr * offsetPackExpr ) = 0;
-	virtual void visit( AttrExpr * node ) { visit( const_cast<const AttrExpr *>(node) ); }
-	virtual void visit( const AttrExpr * attrExpr ) = 0;
 	virtual void visit( LogicalExpr * node ) { visit( const_cast<const LogicalExpr *>(node) ); }
 	virtual void visit( const LogicalExpr * logicalExpr ) = 0;
