Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 25773cd955079ce07aaa7328c6ad0675f8246c4e)
+++ src/Parser/ParseNode.h	(revision 67d4e37911c715a1d255581a76351b6097f6d79f)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 13 17:36:49 2019
-// Update Count     : 867
+// Last Modified On : Sat Apr 13 15:44:20 2019
+// Update Count     : 873
 //
 
@@ -132,12 +132,13 @@
 	void printOneLine( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
 
-	Expression *get_expr() const { return expr.get(); }
+	Expression * get_expr() const { return expr.get(); }
 	template<typename T>
 	bool isExpressionType() const {	return nullptr != dynamic_cast<T>(expr.get()); }
 
 	Expression * build() const { return const_cast<ExpressionNode *>(this)->expr.release(); }
+
+	std::unique_ptr<Expression> expr;					// public because of lifetime implications
   private:
 	bool extension = false;
-	std::unique_ptr<Expression> expr;
 }; // ExpressionNode
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 25773cd955079ce07aaa7328c6ad0675f8246c4e)
+++ src/Parser/parser.yy	(revision 67d4e37911c715a1d255581a76351b6097f6d79f)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 15 14:25:43 2019
-// Update Count     : 4248
+// Last Modified On : Sat Apr 13 14:00:24 2019
+// Update Count     : 4285
 //
 
@@ -334,10 +334,10 @@
 %type<en> subrange
 %type<decl> asm_name_opt
-%type<en> asm_operands_opt asm_operands_list asm_operand
+%type<en> asm_operands_opt				asm_operands_list			asm_operand
 %type<label> label_list
 %type<en> asm_clobbers_list_opt
 %type<flag> asm_volatile_opt
 %type<en> handler_predicate_opt
-%type<genexpr> generic_association generic_assoc_list
+%type<genexpr> generic_association		generic_assoc_list
 
 // statements
@@ -1164,5 +1164,22 @@
 	for_control_expression
 	| for_control_expression_list ':' for_control_expression
-		{ $$ = $3; }
+		// ForCtrl + ForCtrl:
+		//    init + init => multiple declaration statements that are hoisted
+		//    condition + condition => (expression) && (expression)
+		//    change + change => (expression), (expression)
+		{
+			$1->init->set_last( $3->init );
+			if ( $1->condition ) {
+				if ( $3->condition ) {
+					$1->condition->expr.reset( new LogicalExpr( $1->condition->expr.release(), $3->condition->expr.release(), true ) );
+				} // if
+			} else $1->condition = $3->condition;
+			if ( $1->change ) {
+				if ( $3->change ) {
+					$1->change->expr.reset( new CommaExpr( $1->change->expr.release(), $3->change->expr.release() ) );
+				} // if
+			} else $1->change = $3->change;
+			$$ = $1;
+		}
 	;
 
@@ -1174,4 +1191,5 @@
 	| declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
 		{ $$ = new ForCtrl( $1, $2, $4 ); }
+
 	| comma_expression									// CFA
 		{ $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
@@ -1188,4 +1206,10 @@
 	| comma_expression ';' comma_expression inclexcl comma_expression '~' comma_expression // CFA
 		{ $$ = forCtrl( $3, $1, $3->clone(), $4, $5, $7 ); }
+
+		// There is a S/R conflicit if ~ and -~ are factored out.
+	| comma_expression ';' comma_expression '~' '@'		// CFA
+		{ $$ = forCtrl( $3, $1, $3->clone(), OperKinds::LThan, nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
+	| comma_expression ';' comma_expression ErangeDown '@' // CFA
+		{ $$ = forCtrl( $3, $1, $3->clone(), OperKinds::GThan, nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
 	| comma_expression ';' comma_expression '~' '@' '~' comma_expression // CFA
 		{ $$ = forCtrl( $3, $1, $3->clone(), OperKinds::LThan, nullptr, $7 ); }
Index: tests/.expect/loopctrl.txt
===================================================================
--- tests/.expect/loopctrl.txt	(revision 25773cd955079ce07aaa7328c6ad0675f8246c4e)
+++ tests/.expect/loopctrl.txt	(revision 67d4e37911c715a1d255581a76351b6097f6d79f)
@@ -19,4 +19,6 @@
 10 8 6 4 2
 
+1 2 3 4 5 6 7 8 9 10
+10 9 8 7 6 5 4 3 2 1 0
 2 4 6 8 10
 2.1 3.8 5.5 7.2 8.9
@@ -42,2 +44,16 @@
 (10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)
 (10 10)(9 9)(8 8)(7 7)(6 6)(5 5)(4 4)(3 3)(2 2)(1 1)(0 0)
+
+0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4
+0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14
+0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13
+0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23
+
+0 -5 1 -4 2 -3 3 -2 4 -1 5 0 6 1 7 2 8 3 9 4
+0 -5 1 -6 2 -7 3 -8 4 -9 5 -10 6 -11 7 -12 8 -13 9 -14
+0 -5 1 -3 2 -1 3 1 4 3 5 5 6 7 7 9 8 11 9 13
+0 -5 1 -7 2 -9 3 -11 4 -13 5 -15 6 -17 7 -19 8 -21 9 -23
+
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
+0 -5 1.5 1 -7 2.5 2 -9 3.5 3 -11 4.5 4 -13 5.5 5 -15 6.5 6 -17 7.5 7 -19 8.5 8 -21 9.5 9 -23 10.5
Index: tests/loopctrl.cfa
===================================================================
--- tests/loopctrl.cfa	(revision 25773cd955079ce07aaa7328c6ad0675f8246c4e)
+++ tests/loopctrl.cfa	(revision 67d4e37911c715a1d255581a76351b6097f6d79f)
@@ -10,6 +10,6 @@
 // Created On       : Wed Aug  8 18:32:59 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 21 08:54:47 2019
-// Update Count     : 86
+// Last Modified On : Sat Apr 13 11:03:09 2019
+// Update Count     : 104
 // 
 
@@ -56,4 +56,13 @@
 	for ( ui; 10u -~= 2u ~ 2u ) { sout | ui; }			sout | nl | nl;
 
+	// @ means do nothing
+	for ( i; 1 ~ @ ) {
+	  if ( i > 10 ) break;
+		sout | i;
+	}													sout | nl;
+	for ( i; 10 -~ @ ) {
+	  if ( i < 0 ) break;
+		sout | i;
+	}													sout | nl;
 	for ( i; 2 ~ @ ~ 2 ) {
 	  if ( i > 10 ) break;
@@ -94,5 +103,19 @@
 	for ( s; (S){10,10} -~ (S){0} ~ (S){1} ) { sout | s; } sout | nl;
 	for ( s; (S){10,10} -~= (S){0} ) { sout | s; }		 sout | nl;
-	for ( s; (S){10,10} -~= (S){0} ~ (S){1} ) { sout | s; } sout | nl;
+	for ( s; (S){10,10} -~= (S){0} ~ (S){1} ) { sout | s; } sout | nl | nl;
+
+	for ( i; 10 : j; -5 ~ @ ) { sout | i | j; } sout | nl;
+	for ( i; 10 : j; -5 -~ @ ) { sout | i | j; } sout | nl;
+	for ( i; 10 : j; -5 ~ @ ~ 2 ) { sout | i | j; } sout | nl;
+	for ( i; 10 : j; -5 -~ @ ~ 2 ) { sout | i | j; } sout | nl | nl;
+
+	for ( j; -5 ~ @ : i; 10 ) { sout | i | j; } sout | nl;
+	for ( j; -5 -~ @ : i; 10 ) { sout | i | j; } sout | nl;
+	for ( j; -5 ~ @ ~ 2 : i; 10 ) { sout | i | j; } sout | nl;
+	for ( j; -5 -~ @ ~ 2 : i; 10 ) { sout | i | j; } sout | nl | nl;
+
+	for ( j; -5 -~ @ ~ 2 : i; 10 : k; 1.5 ~ @ ) { sout | i | j | k; } sout | nl;
+	for ( j; -5 -~ @ ~ 2 : k; 1.5 ~ @ : i; 10 ) { sout | i | j | k; } sout | nl;
+	for ( k; 1.5 ~ @ : j; -5 -~ @ ~ 2 : i; 10 ) { sout | i | j | k; } sout | nl;
 }
 
