Index: src/expr.c
===================================================================
--- src/expr.c	(revision 17115)
+++ src/expr.c	(working copy)
@@ -317,7 +317,41 @@
 
 /***************************************************************************/
 
+/**
+ * gnm_expr_new_range_ctor:
+ * @l: start range
+ * @r: end range
+ *
+ * This function builds a range constructor or something simpler,
+ * but equivalent, if the arguments allow it. 
+ *
+ * Note: this takes ownership of @l and @r and may delete them.
+ **/
 GnmExpr const *
+gnm_expr_new_range_ctor (GnmExpr const *l, GnmExpr const *r)
+{
+	GnmValue *v;
+
+	g_return_val_if_fail (l != NULL, NULL);
+	g_return_val_if_fail (r != NULL, NULL);
+
+	if (GNM_EXPR_GET_OPER (l) != GNM_EXPR_OP_CELLREF)
+		goto fallback;
+	if (GNM_EXPR_GET_OPER (r) != GNM_EXPR_OP_CELLREF)
+		goto fallback;
+
+	v = value_new_cellrange_unsafe (&l->cellref.ref, &r->cellref.ref);
+	gnm_expr_free (l);
+	gnm_expr_free (r);
+	return gnm_expr_new_constant (v);
+
+ fallback:
+	return gnm_expr_new_binary (l, GNM_EXPR_OP_RANGE_CTOR, r);
+}
+
+/***************************************************************************/
+
+GnmExpr const *
 gnm_expr_copy (GnmExpr const *expr)
 {
 	g_return_val_if_fail (expr != NULL, NULL);
Index: src/expr.h
===================================================================
--- src/expr.h	(revision 17115)
+++ src/expr.h	(working copy)
@@ -72,6 +72,7 @@
 					 Sheet *sheet_scope, Workbook *wb_scope);
 GnmExpr const *gnm_expr_new_cellref	(GnmCellRef const *cr);
 GnmExpr const *gnm_expr_new_set		(GnmExprList *args);
+GnmExpr const *gnm_expr_new_range_ctor  (GnmExpr const *l, GnmExpr const *r);
 
 GnmValue      *gnm_expr_get_range    (GnmExpr const *expr);
 GnmFunc       *gnm_expr_get_func_def (GnmExpr const *expr);
Index: src/parser.y
===================================================================
--- src/parser.y	(revision 17115)
+++ src/parser.y	(working copy)
@@ -388,6 +388,8 @@
 static GnmExpr *
 build_range_ctor (GnmExpr *l, GnmExpr *r, GnmExpr *validate)
 {
+	if (!l || !r) return NULL;
+
 	if (validate != NULL) {
 		if (GNM_EXPR_GET_OPER (validate) != GNM_EXPR_OP_CELLREF ||
 		    validate->cellref.ref.sheet != NULL) {
@@ -397,7 +399,10 @@
 			return NULL;
 		    }
 	}
-	return build_binop (l, GNM_EXPR_OP_RANGE_CTOR, r);
+
+	unregister_allocation (r);
+	unregister_allocation (l);
+	return register_expr_allocation (gnm_expr_new_range_ctor (l, r));
 }
 
 /*
@@ -788,7 +793,8 @@
 		if ($$ == NULL) { YYERROR; }
 	}
 	| RANGEREF RANGE_SEP RANGEREF {
-		$$ = build_binop ($1, GNM_EXPR_OP_RANGE_CTOR, $3);
+		$$ = build_range_ctor ($1, $3, NULL);
+		if ($$ == NULL) { YYERROR; }
 	}
 	;
 
Index: plugins/excel/ms-formula-read.c
===================================================================
--- plugins/excel/ms-formula-read.c	(revision 17115)
+++ plugins/excel/ms-formula-read.c	(working copy)
@@ -1012,8 +1012,7 @@
 		case FORMULA_PTG_EQUAL :
 		case FORMULA_PTG_GTE : case FORMULA_PTG_GT :
 		case FORMULA_PTG_NOT_EQUAL :
-		case FORMULA_PTG_INTERSECT :
-		case FORMULA_PTG_RANGE : {
+		case FORMULA_PTG_INTERSECT : {
 			GnmExpr const *r = parse_list_pop (&stack);
 			GnmExpr const *l = parse_list_pop (&stack);
 			parse_list_push (&stack, gnm_expr_new_binary (
@@ -1023,6 +1022,14 @@
 			break;
 		}
 
+		case FORMULA_PTG_RANGE : {
+			GnmExpr const *r = parse_list_pop (&stack);
+			GnmExpr const *l = parse_list_pop (&stack);
+			parse_list_push (&stack,
+					 gnm_expr_new_range_ctor (l, r));
+			break;
+		}
+
 		case FORMULA_PTG_UNION : {
 			GnmExpr const *r = parse_list_pop (&stack);
 			GnmExpr const *l = parse_list_pop (&stack);
