Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision b3c796366b707de21c95ee20102dd82d1d0d0c87)
+++ src/Parser/ExpressionNode.cc	(revision d130fe87f4cdf82b08c0879a57d7bae53c7644a2)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Sep 12 10:00:29 2017
-// Update Count     : 672
+// Last Modified On : Wed Sep 13 14:54:19 2017
+// Update Count     : 683
 //
 
@@ -250,18 +250,22 @@
 	sepString( str, units, '"' );						// separate constant from units
 
-	BasicType::Kind strtype = BasicType::Char;			// default string type
-	switch ( str[0] ) {									// str has >= 2 characters, i.e, null string ""
+	Type * strtype;
+	switch ( str[0] ) {									// str has >= 2 characters, i.e, null string "" => safe to look at subscripts 0/1
 	  case 'u':
-		if ( str[1] == '8' ) break;						// utf-8 characters
-		strtype = BasicType::ShortUnsignedInt;
+		if ( str[1] == '8' ) goto Default;				// utf-8 characters => array of char
+		// lookup type of associated typedef
+		strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "char16_t", false );
 		break;
 	  case 'U':
-		strtype = BasicType::UnsignedInt;
+		strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "char32_t", false );
 		break;
 	  case 'L':
-		strtype = BasicType::SignedInt;
+		strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "wchar_t", false );
 		break;
+	  Default:											// char default string type
+	  default:
+		strtype = new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char );
 	} // switch
-	ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), strtype ),
+	ArrayType * at = new ArrayType( noQualifiers, strtype,
 									new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'
 									false, false );
@@ -344,12 +348,9 @@
 
 Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) {
-	Type * targetType = maybeMoveBuildType( decl_node );
-	Expression * castArg = maybeMoveBuild< Expression >( expr_node );
-	return new VirtualCastExpr( castArg, targetType );
+	return new VirtualCastExpr( maybeMoveBuild< Expression >( expr_node ), maybeMoveBuildType( decl_node ) );
 } // build_virtual_cast
 
 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ) {
-	UntypedMemberExpr * ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
-	return ret;
+	return new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
 } // build_fieldSel
 
@@ -363,5 +364,5 @@
 
 Expression * build_addressOf( ExpressionNode * expr_node ) {
-		return new AddressExpr( maybeMoveBuild< Expression >(expr_node) );
+	return new AddressExpr( maybeMoveBuild< Expression >(expr_node) );
 } // build_addressOf
 
@@ -422,8 +423,4 @@
 } // build_cond
 
-Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {
-	return new CommaExpr( maybeMoveBuild< Expression >(expr_node1), maybeMoveBuild< Expression >(expr_node2) );
-} // build_comma
-
 Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node ) {
 	return new AttrExpr( var, maybeMoveBuild< Expression >(expr_node) );
@@ -449,16 +446,4 @@
 	return new RangeExpr( maybeMoveBuild< Expression >( low ), maybeMoveBuild< Expression >( high ) );
 } // build_range
-
-Expression * build_asmexpr( ExpressionNode * inout, Expression * constraint, ExpressionNode * operand ) {
-	return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) );
-} // build_asmexpr
-
-Expression * build_valexpr( StatementNode * s ) {
-	return new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(s) ) );
-} // build_valexpr
-
-Expression * build_typevalue( DeclarationNode * decl ) {
-	return new TypeExpr( maybeMoveBuildType( decl ) );
-} // build_typevalue
 
 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids ) {
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision b3c796366b707de21c95ee20102dd82d1d0d0c87)
+++ src/Parser/ParseNode.h	(revision d130fe87f4cdf82b08c0879a57d7bae53c7644a2)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Sep 10 09:56:32 2017
-// Update Count     : 801
+// Last Modified On : Wed Sep 13 12:35:10 2017
+// Update Count     : 807
 //
 
@@ -122,7 +122,5 @@
 
 	template<typename T>
-	bool isExpressionType() const {
-		return nullptr != dynamic_cast<T>(expr.get());
-	}
+	bool isExpressionType() const {	return nullptr != dynamic_cast<T>(expr.get()); }
 
 	Expression * build() const { return const_cast<ExpressionNode *>(this)->expr.release(); }
@@ -172,5 +170,4 @@
 
 NameExpr * build_varref( const std::string * name );
-Expression * build_typevalue( DeclarationNode * decl );
 
 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
@@ -191,5 +188,4 @@
 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
 Expression * build_cond( ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 );
-Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
 Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node );
 Expression * build_attrtype( NameExpr * var, DeclarationNode * decl_node );
@@ -197,6 +193,4 @@
 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node );
 Expression * build_range( ExpressionNode * low, ExpressionNode * high );
-Expression * build_asmexpr( ExpressionNode * inout, Expression * constraint, ExpressionNode * operand );
-Expression * build_valexpr( StatementNode * s );
 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids );
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision b3c796366b707de21c95ee20102dd82d1d0d0c87)
+++ src/Parser/parser.yy	(revision d130fe87f4cdf82b08c0879a57d7bae53c7644a2)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep 11 18:12:00 2017
-// Update Count     : 2787
+// Last Modified On : Wed Sep 13 11:01:20 2017
+// Update Count     : 2803
 //
 
@@ -56,4 +56,5 @@
 #include "LinkageSpec.h"
 #include "Common/SemanticError.h"						// error_str
+#include "Common/utility.h"								// for maybeMoveBuild, maybeBuild, CodeLo...
 
 extern DeclarationNode * parseTree;
@@ -438,5 +439,5 @@
 		{ $$ = $2; }
 	| '(' compound_statement ')'						// GCC, lambda expression
-		{ $$ = new ExpressionNode( build_valexpr( $2 ) ); }
+		{ $$ = new ExpressionNode( new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >($2) ) ) ); }
 	| primary_expression '{' argument_expression_list '}' // CFA, constructor call
 		{
@@ -618,7 +619,7 @@
 		// VIRTUAL cannot be opt because of look ahead issues
 	| '(' VIRTUAL ')' cast_expression
-		{ $$ = new ExpressionNode( build_virtual_cast( nullptr, $4 ) ); }
+		{ $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression >( $4 ), maybeMoveBuildType( nullptr ) ) ); }
 	| '(' VIRTUAL type_no_function ')' cast_expression
-		{ $$ = new ExpressionNode( build_virtual_cast( $3, $5 ) ); }
+		{ $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression >( $5 ), maybeMoveBuildType( $3 ) ) ); }
 //	| '(' type_no_function ')' tuple
 //		{ $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
@@ -771,5 +772,5 @@
 	assignment_expression
 	| comma_expression ',' assignment_expression
-		{ $$ = new ExpressionNode( build_comma( $1, $3 ) ); }
+		{ $$ = new ExpressionNode( new CommaExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); }
 	;
 
@@ -1154,7 +1155,7 @@
 asm_operand:											// GCC
 	string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( build_asmexpr( 0, $1, $3 ) ); }
+		{ $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( (ExpressionNode *)nullptr ), $1, maybeMoveBuild< Expression >( $3 ) ) ); }
 	| '[' constant_expression ']' string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( build_asmexpr( $2, $4, $6 ) ); }
+		{ $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( $2 ), $4, maybeMoveBuild< Expression >( $6 ) ) ); }
 	;
 
@@ -1165,5 +1166,5 @@
 		{ $$ = new ExpressionNode( $1 ); }
 	| asm_clobbers_list_opt ',' string_literal
-		// set_last return ParseNode *
+		// set_last returns ParseNode *
 		{ $$ = (ExpressionNode *)$1->set_last( new ExpressionNode( $3 ) ); }
 	;
@@ -2165,8 +2166,8 @@
 type_list:												// CFA
 	type
-		{ $$ = new ExpressionNode( build_typevalue( $1 ) ); }
+		{ $$ = new ExpressionNode( new TypeExpr( maybeMoveBuildType( $1 ) ) ); }
 	| assignment_expression
 	| type_list ',' type
-		{ $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( build_typevalue( $3 ) ) ) ); }
+		{ $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( new TypeExpr( maybeMoveBuildType( $3 ) ) ) ) ); }
 	| type_list ',' assignment_expression
 		{ $$ = (ExpressionNode *)( $1->set_last( $3 )); }
