Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 0b0a285cb86eb63d47d96868ae2d0f99f753448c)
+++ src/Parser/DeclarationNode.cc	(revision c84dd616ea09c9d1bd0ef0c0fba904ff70c4d83d)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 12:34:05 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Apr 20 11:46:00 2023
-// Update Count     : 1393
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Jun 17 14:41:48 2023
+// Update Count     : 1405
 //
 
@@ -459,6 +459,5 @@
 	std::vector<ast::ptr<ast::Expr>> exprs;
 	buildList( expr, exprs );
-	newnode->attributes.push_back(
-		new ast::Attribute( *name, std::move( exprs ) ) );
+	newnode->attributes.push_back( new ast::Attribute( *name, std::move( exprs ) ) );
 	delete name;
 	return newnode;
@@ -633,15 +632,18 @@
 					dst->basictype = src->basictype;
 				} else if ( src->basictype != DeclarationNode::NoBasicType )
-					SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::basicTypeNames[ src->basictype ] + " in type: " );
+					SemanticError( yylloc, string( "multiple declaration types \"" ) + DeclarationNode::basicTypeNames[ dst->basictype ] +
+								   "\" and \"" + DeclarationNode::basicTypeNames[ src->basictype ] + "\"." );
 
 				if ( dst->complextype == DeclarationNode::NoComplexType ) {
 					dst->complextype = src->complextype;
 				} else if ( src->complextype != DeclarationNode::NoComplexType )
-					SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::complexTypeNames[ src->complextype ] + " in type: " );
+					SemanticError( yylloc, string( "multiple declaration types \"" ) + DeclarationNode::complexTypeNames[ src->complextype ] +
+								   "\" and \"" + DeclarationNode::complexTypeNames[ src->complextype ] + "\"." );
 
 				if ( dst->signedness == DeclarationNode::NoSignedness ) {
 					dst->signedness = src->signedness;
 				} else if ( src->signedness != DeclarationNode::NoSignedness )
-					SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::signednessNames[ src->signedness ] + " in type: " );
+					SemanticError( yylloc, string( "conflicting type specifier \"" ) + DeclarationNode::signednessNames[ dst->signedness ] +
+								   "\" and \"" + DeclarationNode::signednessNames[ src->signedness ] + "\"." );
 
 				if ( dst->length == DeclarationNode::NoLength ) {
@@ -650,5 +652,6 @@
 					dst->length = DeclarationNode::LongLong;
 				} else if ( src->length != DeclarationNode::NoLength )
-					SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::lengthNames[ src->length ] + " in type: " );
+					SemanticError( yylloc, string( "conflicting type specifier \"" ) + DeclarationNode::lengthNames[ dst->length ] +
+								   "\" and \"" + DeclarationNode::lengthNames[ src->length ] + "\"." );
 			} // if
 			break;
@@ -718,7 +721,7 @@
 
 DeclarationNode * DeclarationNode::addEnumBase( DeclarationNode * o ) {
-	if ( o && o -> type)  {
+	if ( o && o->type)  {
 		type->base= o->type;
-	}
+	} // if
 	delete o;
 	return this;
@@ -1003,6 +1006,6 @@
 }
 
-// If a typedef wraps an anonymous declaration, name the inner declaration
-// so it has a consistent name across translation units.
+// If a typedef wraps an anonymous declaration, name the inner declaration so it has a consistent name across
+// translation units.
 static void nameTypedefedDecl(
 		DeclarationNode * innerDecl,
@@ -1085,6 +1088,5 @@
 }
 
-void buildList( DeclarationNode * firstNode,
-		std::vector<ast::ptr<ast::Decl>> & outputList ) {
+void buildList( DeclarationNode * firstNode, std::vector<ast::ptr<ast::Decl>> & outputList ) {
 	SemanticErrorException errors;
 	std::back_insert_iterator<std::vector<ast::ptr<ast::Decl>>> out( outputList );
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 0b0a285cb86eb63d47d96868ae2d0f99f753448c)
+++ src/Parser/ExpressionNode.cc	(revision c84dd616ea09c9d1bd0ef0c0fba904ff70c4d83d)
@@ -601,5 +601,6 @@
 ast::Expr * build_cast( const CodeLocation & location,
 		DeclarationNode * decl_node,
-		ExpressionNode * expr_node ) {
+		ExpressionNode * expr_node,
+		ast::CastExpr::CastKind kind ) {
 	ast::Type * targetType = maybeMoveBuildType( decl_node );
 	if ( dynamic_cast<ast::VoidType *>( targetType ) ) {
@@ -607,10 +608,10 @@
 		return new ast::CastExpr( location,
 			maybeMoveBuild( expr_node ),
-			ast::ExplicitCast );
+			ast::ExplicitCast, kind );
 	} else {
 		return new ast::CastExpr( location,
 			maybeMoveBuild( expr_node ),
 			targetType,
-			ast::ExplicitCast );
+			ast::ExplicitCast, kind );
 	} // if
 } // build_cast
Index: src/Parser/ExpressionNode.h
===================================================================
--- src/Parser/ExpressionNode.h	(revision 0b0a285cb86eb63d47d96868ae2d0f99f753448c)
+++ src/Parser/ExpressionNode.h	(revision c84dd616ea09c9d1bd0ef0c0fba904ff70c4d83d)
@@ -69,5 +69,5 @@
 ast::DimensionExpr * build_dimensionref( const CodeLocation &, const std::string * name );
 
-ast::Expr * build_cast( const CodeLocation &, DeclarationNode * decl_node, ExpressionNode * expr_node );
+ast::Expr * build_cast( const CodeLocation &, DeclarationNode * decl_node, ExpressionNode * expr_node, ast::CastExpr::CastKind kind = ast::CastExpr::Default );
 ast::Expr * build_keyword_cast( const CodeLocation &, ast::AggregateDecl::Aggregate target, ExpressionNode * expr_node );
 ast::Expr * build_virtual_cast( const CodeLocation &, DeclarationNode * decl_node, ExpressionNode * expr_node );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 0b0a285cb86eb63d47d96868ae2d0f99f753448c)
+++ src/Parser/parser.yy	(revision c84dd616ea09c9d1bd0ef0c0fba904ff70c4d83d)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun  7 14:32:28 2023
-// Update Count     : 6341
+// Last Modified On : Sat Jun 17 18:53:24 2023
+// Update Count     : 6347
 //
 
@@ -931,5 +931,5 @@
 		{ $$ = new ExpressionNode( new ast::VirtualCastExpr( yylloc, maybeMoveBuild( $5 ), maybeMoveBuildType( $3 ) ) ); }
 	| '(' RETURN type_no_function ')' cast_expression	// CFA
-		{ SemanticError( yylloc, "Return cast is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = new ExpressionNode( build_cast( yylloc, $3, $5, ast::CastExpr::Return ) ); }
 	| '(' COERCE type_no_function ')' cast_expression	// CFA
 		{ SemanticError( yylloc, "Coerce cast is currently unimplemented." ); $$ = nullptr; }
@@ -1040,5 +1040,5 @@
 		// FIX ME: computes $1 twice
 	| logical_OR_expression '?' /* empty */ ':' conditional_expression // GCC, omitted first operand
-		{ $$ = new ExpressionNode( build_cond( yylloc, $1, $1, $4 ) ); }
+		{ $$ = new ExpressionNode( build_cond( yylloc, $1, $1->clone(), $4 ) ); }
 	;
 
