Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/CodeGen/CodeGenerator.cc	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -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 : Fri Aug 18 15:34:00 2017
-// Update Count     : 488
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Sep  3 20:42:52 2017
+// Update Count     : 490
 //
 #include "CodeGenerator.h"
@@ -59,5 +59,5 @@
 
 	void CodeGenerator::asmName( DeclarationWithType * decl ) {
-		if ( ConstantExpr * asmName = decl->get_asmName() ) {
+		if ( ConstantExpr * asmName = dynamic_cast<ConstantExpr *>(decl->get_asmName()) ) {
 			output << " asm ( " << asmName->get_constant()->get_value() << " )";
 		} // if
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/Parser/ExpressionNode.cc	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Sep  1 22:57:24 2017
-// Update Count     : 625
+// Last Modified On : Sun Sep  3 22:21:21 2017
+// Update Count     : 639
 //
 
@@ -218,16 +218,28 @@
 } // build_constantChar
 
-ConstantExpr * build_constantStr( string & str ) {
+Expression * build_constantStr( string & str ) {
 	string units;										// units
 	sepString( str, units, '"' );						// separate constant from units
 
-	ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
+	BasicType::Kind strtype = BasicType::Char;			// default string type
+	switch ( str[0] ) {									// str has >= 2 characters, i.e, null string ""
+	  case 'u':
+		if ( str[1] == '8' ) break;						// utf-8 characters
+		strtype = BasicType::ShortUnsignedInt;
+		break;
+	  case 'U':
+		strtype = BasicType::UnsignedInt;
+		break;
+	  case 'L':
+		strtype = BasicType::SignedInt;
+		break;
+	} // switch
+	ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), strtype ),
 									new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'
 									false, false );
-	ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value
-// ROB: type mismatch
-	// if ( units.length() != 0 ) {
-	// 	ret = new UntypedExpr( new NameExpr( units ), { ret } );
-	// } // if
+	Expression * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value
+	if ( units.length() != 0 ) {
+		ret = new UntypedExpr( new NameExpr( units ), { ret } );
+	} // if
 
 	delete &str;										// created by lex
@@ -410,5 +422,5 @@
 } // build_range
 
-Expression * build_asmexpr( ExpressionNode * inout, ConstantExpr * constraint, ExpressionNode * operand ) {
+Expression * build_asmexpr( ExpressionNode * inout, Expression * constraint, ExpressionNode * operand ) {
 	return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) );
 } // build_asmexpr
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/Parser/ParseNode.h	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 31 17:42:49 2017
-// Update Count     : 797
+// Last Modified On : Sun Sep  3 19:24:34 2017
+// Update Count     : 799
 //
 
@@ -165,5 +165,5 @@
 Expression * build_constantFloat( std::string &str );
 Expression * build_constantChar( std::string &str );
-ConstantExpr * build_constantStr( std::string &str );
+Expression * build_constantStr( std::string &str );
 Expression * build_field_name_FLOATINGconstant( const std::string & str );
 Expression * build_field_name_fraction_constants( Expression * fieldName, ExpressionNode * fracts );
@@ -197,5 +197,5 @@
 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node );
 Expression * build_range( ExpressionNode * low, ExpressionNode * high );
-Expression * build_asmexpr( ExpressionNode * inout, ConstantExpr * constraint, ExpressionNode * operand );
+Expression * build_asmexpr( ExpressionNode * inout, Expression * constraint, ExpressionNode * operand );
 Expression * build_valexpr( StatementNode * s );
 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids );
@@ -330,5 +330,5 @@
 	bool hasEllipsis;
 	LinkageSpec::Spec linkage;
-	ConstantExpr *asmName;
+	Expression *asmName;
 	std::list< Attribute * > attributes;
 	InitializerNode * initializer;
@@ -413,5 +413,5 @@
 Statement * build_finally( StatementNode * stmt );
 Statement * build_compound( StatementNode * first );
-Statement * build_asmstmt( bool voltile, ConstantExpr * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
+Statement * build_asmstmt( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when );
 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing );
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/Parser/StatementNode.cc	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:59:41 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 17 16:01:31 2017
-// Update Count     : 345
+// Last Modified On : Fri Sep  1 23:25:23 2017
+// Update Count     : 346
 //
 
@@ -300,5 +300,5 @@
 }
 
-Statement *build_asmstmt( bool voltile, ConstantExpr *instruction, ExpressionNode *output, ExpressionNode *input, ExpressionNode *clobber, LabelNode *gotolabels ) {
+Statement *build_asmstmt( bool voltile, Expression *instruction, ExpressionNode *output, ExpressionNode *input, ExpressionNode *clobber, LabelNode *gotolabels ) {
 	std::list< Expression * > out, in;
 	std::list< ConstantExpr * > clob;
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/Parser/TypeData.cc	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 15:12:51 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Aug 14 10:41:00 2017
-// Update Count     : 568
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Sep  1 23:13:38 2017
+// Update Count     : 569
 //
 
@@ -814,5 +814,5 @@
 } // buildTypeof
 
-Declaration * buildDecl( const TypeData * td, const string &name, Type::StorageClasses scs, Expression * bitfieldWidth, Type::FuncSpecifiers funcSpec, LinkageSpec::Spec linkage, ConstantExpr *asmName, Initializer * init, std::list< Attribute * > attributes ) {
+Declaration * buildDecl( const TypeData * td, const string &name, Type::StorageClasses scs, Expression * bitfieldWidth, Type::FuncSpecifiers funcSpec, LinkageSpec::Spec linkage, Expression *asmName, Initializer * init, std::list< Attribute * > attributes ) {
 	if ( td->kind == TypeData::Function ) {
 		if ( td->function.idList ) {					// KR function ?
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/Parser/TypeData.h	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 15:18:36 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Aug 14 10:38:00 2017
-// Update Count     : 189
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Sep  1 23:33:45 2017
+// Update Count     : 190
 //
 
@@ -118,5 +118,5 @@
 TupleType * buildTuple( const TypeData * );
 TypeofType * buildTypeof( const TypeData * );
-Declaration * buildDecl( const TypeData *, const std::string &, Type::StorageClasses, Expression *, Type::FuncSpecifiers funcSpec, LinkageSpec::Spec, ConstantExpr *asmName, Initializer * init = nullptr, std::list< class Attribute * > attributes = std::list< class Attribute * >() );
+Declaration * buildDecl( const TypeData *, const std::string &, Type::StorageClasses, Expression *, Type::FuncSpecifiers funcSpec, LinkageSpec::Spec, Expression * asmName, Initializer * init = nullptr, std::list< class Attribute * > attributes = std::list< class Attribute * >() );
 FunctionType * buildFunction( const TypeData * );
 void buildKRFunction( const TypeData::Function_t & function );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/Parser/parser.yy	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Aug 30 07:04:19 2017
-// Update Count     : 2740
+// Last Modified On : Sun Sep  3 20:43:19 2017
+// Update Count     : 2742
 //
 
@@ -100,5 +100,5 @@
 	StatementNode * sn;
 	WaitForStmt * wfs;
-	ConstantExpr * constant;
+	Expression * constant;
 	IfCtl * ifctl;
 	ForCtl * fctl;
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/SynTree/Declaration.h	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -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 Aug 14 10:15:00 2017
-// Update Count     : 128
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Sep  3 19:24:06 2017
+// Update Count     : 131
 //
 
@@ -82,5 +82,5 @@
 	int scopeLevel = 0;
 
-	ConstantExpr *asmName;
+	Expression *asmName;
 	std::list< Attribute * > attributes;
 
@@ -97,6 +97,6 @@
 	DeclarationWithType * set_scopeLevel( int newValue ) { scopeLevel = newValue; return this; }
 
-	ConstantExpr *get_asmName() const { return asmName; }
-	DeclarationWithType * set_asmName( ConstantExpr *newValue ) { asmName = newValue; return this; }
+	Expression *get_asmName() const { return asmName; }
+	DeclarationWithType * set_asmName( Expression *newValue ) { asmName = newValue; return this; }
 
 	std::list< Attribute * >& get_attributes() { return attributes; }
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/SynTree/Expression.h	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -9,8 +9,9 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Aug  8 11:54:00 2017
-// Update Count     : 44
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Sep  3 19:23:46 2017
+// Update Count     : 48
 //
+
 #pragma once
 
@@ -539,8 +540,8 @@
   public:
 	Expression * inout;
-	ConstantExpr * constraint;
+	Expression * constraint;
 	Expression * operand;
 
-	AsmExpr( Expression * inout, ConstantExpr * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
+	AsmExpr( Expression * inout, Expression * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
 	AsmExpr( const AsmExpr & other );
 	virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };
@@ -549,6 +550,6 @@
 	void set_inout( Expression * newValue ) { inout = newValue; }
 
-	ConstantExpr * get_constraint() const { return constraint; }
-	void set_constraint( ConstantExpr * newValue ) { constraint = newValue; }
+	Expression * get_constraint() const { return constraint; }
+	void set_constraint( Expression * newValue ) { constraint = newValue; }
 
 	Expression * get_operand() const { return operand; }
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/SynTree/Statement.cc	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 17 16:17:20 2017
-// Update Count     : 67
+// Last Modified On : Sun Sep  3 20:46:44 2017
+// Update Count     : 68
 //
 
@@ -52,5 +52,5 @@
 
 
-AsmStmt::AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement( labels ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
+AsmStmt::AsmStmt( std::list<Label> labels, bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement( labels ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
 
 AsmStmt::AsmStmt( const AsmStmt & other ) : Statement( other ), voltile( other.voltile ), instruction( maybeClone( other.instruction ) ), gotolabels( other.gotolabels ) {
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision f43df7359a563135ee2a3401a290c3f7ccdeccf5)
+++ src/SynTree/Statement.h	(revision e612146ca26ec8e8adeb5426e498fe10f3523f40)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 17 15:37:53 2017
-// Update Count     : 72
+// Last Modified On : Sun Sep  3 20:46:46 2017
+// Update Count     : 77
 //
 
@@ -98,10 +98,10 @@
   public:
 	bool voltile;
-	ConstantExpr *instruction;
+	Expression *instruction;
 	std::list<Expression *> output, input;
 	std::list<ConstantExpr *> clobber;
 	std::list<Label> gotolabels;
 
-	AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> input, std::list<Expression *> output, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels );
+	AsmStmt( std::list<Label> labels, bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels );
 	AsmStmt( const AsmStmt &other );
 	virtual ~AsmStmt();
@@ -109,19 +109,19 @@
 	bool get_voltile() { return voltile; }
 	void set_voltile( bool newValue ) { voltile = newValue; }
-	ConstantExpr *get_instruction() { return instruction; }
-	void set_instruction( ConstantExpr *newValue ) { instruction = newValue; }
-	std::list<Expression *> &get_output() { return output; }
-	void set_output( const std::list<Expression *> &newValue ) { output = newValue; }
-	std::list<Expression *> &get_input() { return input; }
+	Expression * get_instruction() { return instruction; }
+	void set_instruction( Expression * newValue ) { instruction = newValue; }
+	std::list<Expression *> & get_output() { return output; }
+	void set_output( const std::list<Expression *> & newValue ) { output = newValue; }
+	std::list<Expression *> & get_input() { return input; }
 	void set_input( const std::list<Expression *> &newValue ) { input = newValue; }
-	std::list<ConstantExpr *> &get_clobber() { return clobber; }
+	std::list<ConstantExpr *> & get_clobber() { return clobber; }
 	void set_clobber( const std::list<ConstantExpr *> &newValue ) { clobber = newValue; }
-	std::list<Label> &get_gotolabels() { return gotolabels; }
+	std::list<Label> & get_gotolabels() { return gotolabels; }
 	void set_gotolabels( const std::list<Label> &newValue ) { gotolabels = newValue; }
 
-	virtual AsmStmt *clone() const { return new AsmStmt( *this ); }
-	virtual void accept( Visitor &v ) { v.visit( this ); }
-	virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
-	virtual void print( std::ostream &os, int indent = 0 ) const;
+	virtual AsmStmt * clone() const { return new AsmStmt( *this ); }
+	virtual void accept( Visitor & v ) { v.visit( this ); }
+	virtual Statement * acceptMutator( Mutator & m ) { return m.mutate( this ); }
+	virtual void print( std::ostream & os, int indent = 0 ) const;
 };
 
