Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/AST/Convert.cpp	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -887,5 +887,5 @@
 		auto expr = visitBaseExpr( node,
 			new AsmExpr(
-				get<Expression>().accept1(node->inout),
+				new std::string(node->inout),
 				get<Expression>().accept1(node->constraint),
 				get<Expression>().accept1(node->operand)
@@ -2258,5 +2258,5 @@
 			new ast::AsmExpr(
 				old->location,
-				GET_ACCEPT_1(inout, Expr),
+				old->inout,
 				GET_ACCEPT_1(constraint, Expr),
 				GET_ACCEPT_1(operand, Expr)
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/AST/Expr.hpp	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -556,9 +556,9 @@
 class AsmExpr final : public Expr {
 public:
-	ptr<Expr> inout;
+	std::string inout;
 	ptr<Expr> constraint;
 	ptr<Expr> operand;
 
-	AsmExpr( const CodeLocation & loc, const Expr * io, const Expr * con, const Expr * op )
+	AsmExpr( const CodeLocation & loc, const std::string & io, const Expr * con, const Expr * op )
 	: Expr( loc ), inout( io ), constraint( con ), operand( op ) {}
 
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/AST/Pass.impl.hpp	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -1300,5 +1300,4 @@
 			maybe_accept( node, &AsmExpr::result );
 		}
-		maybe_accept( node, &AsmExpr::inout      );
 		maybe_accept( node, &AsmExpr::constraint );
 		maybe_accept( node, &AsmExpr::operand    );
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/AST/Print.cpp	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -1011,5 +1011,5 @@
 		os << "Asm Expression:" << endl;
 		++indent;
-		if ( node->inout ) node->inout->accept( *this );
+		if ( !node->inout.empty() ) os << "[" << node->inout << "] ";
 		if ( node->constraint ) node->constraint->accept( *this );
 		if ( node->operand ) node->operand->accept( *this );
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/CodeGen/CodeGenerator.cc	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -786,12 +786,12 @@
 
 	void CodeGenerator::postvisit( AsmExpr * asmExpr ) {
-		if ( asmExpr->get_inout() ) {
+		if ( !asmExpr->inout.empty() ) {
 			output << "[ ";
-			asmExpr->get_inout()->accept( *visitor );
+			output << asmExpr->inout;
 			output << " ] ";
 		} // if
-		asmExpr->get_constraint()->accept( *visitor );
+		asmExpr->constraint->accept( *visitor );
 		output << " ( ";
-		asmExpr->get_operand()->accept( *visitor );
+		asmExpr->operand->accept( *visitor );
 		output << " )";
 	}
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/Common/PassVisitor.impl.h	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -2452,5 +2452,4 @@
 
 	indexerScopedAccept( node->result    , *this );
-	maybeAccept_impl   ( node->inout     , *this );
 	maybeAccept_impl   ( node->constraint, *this );
 	maybeAccept_impl   ( node->operand   , *this );
@@ -2464,5 +2463,4 @@
 
 	indexerScopedAccept( node->result    , *this );
-	maybeAccept_impl   ( node->inout     , *this );
 	maybeAccept_impl   ( node->constraint, *this );
 	maybeAccept_impl   ( node->operand   , *this );
@@ -2477,5 +2475,4 @@
 	indexerScopedMutate( node->env       , *this );
 	indexerScopedMutate( node->result    , *this );
-	maybeMutate_impl   ( node->inout     , *this );
 	maybeMutate_impl   ( node->constraint, *this );
 	maybeMutate_impl   ( node->operand   , *this );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/Parser/parser.yy	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -1423,7 +1423,7 @@
 asm_operand:											// GCC
 	string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( (ExpressionNode *)nullptr ), $1, maybeMoveBuild< Expression >( $3 ) ) ); }
-	| '[' constant_expression ']' string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( $2 ), $4, maybeMoveBuild< Expression >( $6 ) ) ); }
+		{ $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild< Expression >( $3 ) ) ); }
+	| '[' IDENTIFIER ']' string_literal '(' constant_expression ')'
+		{ $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild< Expression >( $6 ) ) ); }
 	;
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/ResolvExpr/Resolver.cc	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -485,7 +485,4 @@
 		visit_children = false;
 		findVoidExpression( asmExpr->operand, indexer );
-		if ( asmExpr->get_inout() ) {
-			findVoidExpression( asmExpr->inout, indexer );
-		} // if
 	}
 
@@ -1365,9 +1362,4 @@
 		asmExpr = ast::mutate_field(
 			asmExpr, &ast::AsmExpr::operand, findVoidExpression( asmExpr->operand, symtab ) );
-
-		if ( asmExpr->inout ) {
-			asmExpr = ast::mutate_field(
-				asmExpr, &ast::AsmExpr::inout, findVoidExpression( asmExpr->inout, symtab ) );
-		}
 
 		return asmExpr;
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/SynTree/Expression.cc	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -527,10 +527,10 @@
 }
 
-AsmExpr::AsmExpr( const AsmExpr & other ) : Expression( other ), inout( maybeClone( other.inout ) ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
+AsmExpr::AsmExpr( const AsmExpr & other ) : Expression( other ), inout( other.inout ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
 
 
 void AsmExpr::print( std::ostream & os, Indenter indent ) const {
 	os << "Asm Expression: " << std::endl;
-	if ( inout ) inout->print( os, indent+1 );
+	if ( !inout.empty() ) os <<  "[" << inout << "] ";
 	if ( constraint ) constraint->print( os, indent+1 );
 	if ( operand ) operand->print( os, indent+1 );
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ src/SynTree/Expression.h	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -575,20 +575,11 @@
 class AsmExpr : public Expression {
   public:
-	Expression * inout;
+	std::string inout;
 	Expression * constraint;
 	Expression * operand;
 
-	AsmExpr( Expression * inout, Expression * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
+	AsmExpr( const std::string * _inout, Expression * constraint, Expression * operand ) : inout( _inout ? *_inout : "" ), constraint( constraint ), operand( operand ) { delete _inout; }
 	AsmExpr( const AsmExpr & other );
-	virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };
-
-	Expression * get_inout() const { return inout; }
-	void set_inout( Expression * newValue ) { inout = newValue; }
-
-	Expression * get_constraint() const { return constraint; }
-	void set_constraint( Expression * newValue ) { constraint = newValue; }
-
-	Expression * get_operand() const { return operand; }
-	void set_operand( Expression * newValue ) { operand = newValue; }
+	virtual ~AsmExpr() { delete constraint; delete operand; };
 
 	virtual AsmExpr * clone() const override { return new AsmExpr( * this ); }
Index: tests/.expect/gccExtensions.x64.txt
===================================================================
--- tests/.expect/gccExtensions.x64.txt	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ tests/.expect/gccExtensions.x64.txt	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -12,5 +12,5 @@
     asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=" "r" ( _X3dsti_2 ) :  :  );
     asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ) : "r" ( _X3srci_2 ) :  );
-    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ _X3srci_2 ] "r" ( _X3dsti_2 ) : "r0" );
+    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ src ] "r" ( _X3dsti_2 ) : "r0" );
     L2: L1: asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" :  : "r" ( _X3srci_2 ), "r" ( (&_X3dsti_2) ) : "r5", "memory" : L1, L2 );
     double _Complex _X2c1Cd_2;
Index: tests/.expect/gccExtensions.x86.txt
===================================================================
--- tests/.expect/gccExtensions.x86.txt	(revision 57c764c408e93bded4fc2db7b1603b9de7f4ab60)
+++ tests/.expect/gccExtensions.x86.txt	(revision 665f43269c6958cbb65487dbaac9e440b9cd5815)
@@ -12,5 +12,5 @@
     asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=" "r" ( _X3dsti_2 ) :  :  );
     asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ) : "r" ( _X3srci_2 ) :  );
-    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ _X3srci_2 ] "r" ( _X3dsti_2 ) : "r0" );
+    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ src ] "r" ( _X3dsti_2 ) : "r0" );
     L2: L1: asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" :  : "r" ( _X3srci_2 ), "r" ( (&_X3dsti_2) ) : "r5", "memory" : L1, L2 );
     double _Complex _X2c1Cd_2;
