aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2010-03-27 15:57:02 +0000
committerGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2010-03-27 15:57:02 +0000
commitbe76b6af359ea61bc71e59efb4802ff01cce728c (patch)
tree22e894bedaac5f5d8fc29c498042e2ff9bf7767c
parenteab11e537905472fdcc3257bc9913df82c82b3e4 (diff)
Fixing bug #2279 (printing nested let-in was in exponential time)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12887 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r--pretyping/detyping.ml3
-rw-r--r--test-suite/complexity/lettuple.v29
-rw-r--r--test-suite/complexity/ring2.v2
3 files changed, 32 insertions, 2 deletions
diff --git a/pretyping/detyping.ml b/pretyping/detyping.ml
index 905bb49e0..6560f7b48 100644
--- a/pretyping/detyping.ml
+++ b/pretyping/detyping.ml
@@ -327,7 +327,6 @@ let detype_case computable detype detype_eqns testdep avoid data p c bl =
n, aliastyp, Some typ
in
let constructs = Array.init (Array.length bl) (fun i -> (indsp,i+1)) in
- let eqnl = detype_eqns constructs consnargsl bl in
let tag =
try
if !Flags.raw_print then
@@ -355,8 +354,10 @@ let detype_case computable detype detype_eqns testdep avoid data p c bl =
RIf (dl,tomatch,(alias,pred),
Option.get nondepbrs.(0),Option.get nondepbrs.(1))
else
+ let eqnl = detype_eqns constructs consnargsl bl in
RCases (dl,tag,pred,[tomatch,(alias,aliastyp)],eqnl)
| _ ->
+ let eqnl = detype_eqns constructs consnargsl bl in
RCases (dl,tag,pred,[tomatch,(alias,aliastyp)],eqnl)
let detype_sort = function
diff --git a/test-suite/complexity/lettuple.v b/test-suite/complexity/lettuple.v
new file mode 100644
index 000000000..f97decf0a
--- /dev/null
+++ b/test-suite/complexity/lettuple.v
@@ -0,0 +1,29 @@
+(* This example checks if printing nested let-in's stays in linear time *)
+(* Expected time < 1.00s *)
+
+Definition f (x : nat * nat) :=
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ let (a,b) := x in
+ 0.
+
+Timeout 5 Print f.
diff --git a/test-suite/complexity/ring2.v b/test-suite/complexity/ring2.v
index af678a2e1..ab57afdbb 100644
--- a/test-suite/complexity/ring2.v
+++ b/test-suite/complexity/ring2.v
@@ -1,4 +1,4 @@
-(* This example, checks the efficiency of the abstract machine used by ring *)
+(* This example checks the efficiency of the abstract machine used by ring *)
(* Expected time < 1.00s *)
Require Import BinInt Zbool.