From af6577ae64edf6e86cbf5e156aecc262b1177f18 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm@redhat.com>
Date: Thu, 14 Mar 2019 15:50:42 -0400
Subject: [PATCH 108/169] FIXME: more on constraints

---
 gcc/analyzer/constraints.cc                        | 112 ++++++++++++++++++-
 .../TODO-analyzer/facts/noreturn/abort/input.c     |  38 -------
 .../TODO-analyzer/facts/noreturn/abort/script.py   |  33 ------
 .../TODO-analyzer/facts/noreturn/abort/stdout.txt  |   0
 .../gcc.dg/TODO-analyzer/facts/params/stdout.txt   |   0
 .../facts/switch/various-cases/input.c             |  57 ----------
 .../facts/switch/various-cases/script.py           |  62 -----------
 .../facts/switch/various-cases/stdout.txt          |   0
 .../gcc.dg/TODO-analyzer/facts/unittests/input.c   |   1 -
 .../TODO-analyzer/facts/unittests/metadata.ini     |   4 -
 .../gcc.dg/TODO-analyzer/facts/unittests/script.py | 118 ---------------------
 .../TODO-analyzer/facts/unittests/stderr.txt       |  12 ---
 .../TODO-analyzer/facts/unittests/stdout.txt       |   0
 13 files changed, 111 insertions(+), 326 deletions(-)
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/input.c
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/script.py
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/stdout.txt
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/params/stdout.txt
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/input.c
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/script.py
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/stdout.txt
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/input.c
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/metadata.ini
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/script.py
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/stderr.txt
 delete mode 100644 gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/stdout.txt

diff --git a/gcc/analyzer/constraints.cc b/gcc/analyzer/constraints.cc
index a85064e..e4867a0 100644
--- a/gcc/analyzer/constraints.cc
+++ b/gcc/analyzer/constraints.cc
@@ -455,7 +455,10 @@ path_state::add_constraint (path_var lhs, enum tree_code op, path_var rhs)
 	  lhs_ec_obj.add (*v);
 
 	if (rhs_ec_obj.m_constant)
-	  lhs_ec_obj.m_constant = rhs_ec_obj.m_constant;
+	  {
+	    gcc_assert (lhs_ec_obj.m_constant == NULL);
+	    lhs_ec_obj.m_constant = rhs_ec_obj.m_constant;
+	  }
 
 	/* Drop rhs equivalence class, overwriting it with the
 	   final ec (which might be the same one).  */
@@ -747,6 +750,25 @@ test_constraint_conditions ()
     ASSERT_CONDITION_UNKNOWN (ps, x, GT_EXPR, z);
   }
 
+  /* x == y, then y == z  */
+  {
+    path_state ps;
+    ASSERT_CONDITION_UNKNOWN (ps, x, EQ_EXPR, y);
+
+    bool sat_0 = ps.add_constraint (x, EQ_EXPR, y);
+    ASSERT_TRUE (sat_0);
+
+    bool sat_1 = ps.add_constraint (y, EQ_EXPR, z);
+    ASSERT_TRUE (sat_1);
+
+    ASSERT_CONDITION_TRUE (ps, x, EQ_EXPR, z);
+    ASSERT_CONDITION_TRUE (ps, x, LE_EXPR, z);
+    ASSERT_CONDITION_TRUE (ps, x, GE_EXPR, z);
+    ASSERT_CONDITION_FALSE (ps, x, NE_EXPR, z);
+    ASSERT_CONDITION_FALSE (ps, x, LT_EXPR, z);
+    ASSERT_CONDITION_FALSE (ps, x, GT_EXPR, z);
+  }
+
   /* x != y.  */
   {
     path_state ps;
@@ -910,6 +932,33 @@ test_constraint_conditions ()
     ASSERT_FALSE (sat_b);
   }
 
+  /* x == 0 then x == 42.  */
+  {
+    path_state ps;
+    bool sat_a = ps.add_constraint (x, EQ_EXPR, int_0);
+    ASSERT_TRUE (sat_a);
+    bool sat_b = ps.add_constraint (x, EQ_EXPR, int_42);
+    ASSERT_FALSE (sat_b);
+  }
+
+  /* x == 0 then x != 0.  */
+  {
+    path_state ps;
+    bool sat_a = ps.add_constraint (x, EQ_EXPR, int_0);
+    ASSERT_TRUE (sat_a);
+    bool sat_b = ps.add_constraint (x, NE_EXPR, int_0);
+    ASSERT_FALSE (sat_b);
+  }
+
+  /* x == 0 then x > 0.  */
+  {
+    path_state ps;
+    bool sat_a = ps.add_constraint (x, EQ_EXPR, int_0);
+    ASSERT_TRUE (sat_a);
+    bool sat_b = ps.add_constraint (x, GT_EXPR, int_0);
+    ASSERT_FALSE (sat_b);
+  }
+
   /* x != y && x == y.  */
   {
     path_state ps;
@@ -934,6 +983,51 @@ test_constraint_conditions ()
 /* FIXME.  */
 
 static void
+test_constraint_conditions_2 ()
+{
+  path_var int_42 (build_int_cst (integer_type_node, 42), 0);
+  path_var int_0 (build_int_cst (integer_type_node, 0), 0);
+
+  path_var a (build_decl (UNKNOWN_LOCATION, PARM_DECL,
+			  get_identifier ("a"),
+			  integer_type_node), 0);
+  path_var b (build_decl (UNKNOWN_LOCATION, PARM_DECL,
+			  get_identifier ("b"),
+			  integer_type_node), 0);
+  path_var c (build_decl (UNKNOWN_LOCATION, PARM_DECL,
+			  get_identifier ("c"),
+			  integer_type_node), 0);
+  path_var d (build_decl (UNKNOWN_LOCATION, PARM_DECL,
+			  get_identifier ("d"),
+			  integer_type_node), 0);
+
+  /* a == b, then c == d, then c == b.  */
+  {
+    path_state ps;
+    ASSERT_CONDITION_UNKNOWN (ps, a, EQ_EXPR, b);
+    ASSERT_CONDITION_UNKNOWN (ps, b, EQ_EXPR, c);
+    ASSERT_CONDITION_UNKNOWN (ps, c, EQ_EXPR, d);
+    ASSERT_CONDITION_UNKNOWN (ps, a, EQ_EXPR, d);
+
+    bool sat_0 = ps.add_constraint (a, EQ_EXPR, b);
+    ASSERT_TRUE (sat_0);
+    ASSERT_CONDITION_TRUE (ps, a, EQ_EXPR, b);
+
+    bool sat_1 = ps.add_constraint (c, EQ_EXPR, d);
+    ASSERT_TRUE (sat_1);
+    ASSERT_CONDITION_TRUE (ps, c, EQ_EXPR, d);
+    ASSERT_CONDITION_UNKNOWN (ps, a, EQ_EXPR, d);
+
+    bool sat_2 = ps.add_constraint (c, EQ_EXPR, b);
+    ASSERT_TRUE (sat_2);
+    ASSERT_CONDITION_TRUE (ps, c, EQ_EXPR, b);
+    ASSERT_CONDITION_TRUE (ps, a, EQ_EXPR, d);
+  }
+}
+
+/* FIXME.  */
+
+static void
 test_constraint_impl ()
 {
   path_var int_42 (build_int_cst (integer_type_node, 42), 0);
@@ -1005,6 +1099,21 @@ test_constraint_impl ()
     ASSERT_CONDITION_TRUE (ps, x, GE_EXPR, z);
   }
 
+  /* x == 0, then x != 42.  */
+  {
+    path_state ps;
+
+    bool sat_0 = ps.add_constraint (x, EQ_EXPR, int_0);
+    ASSERT_TRUE (sat_0);
+
+    bool sat_1 = ps.add_constraint (x, NE_EXPR, int_42);
+    ASSERT_TRUE (sat_1);
+
+    /* Assert various things about the insides of ps.  */
+    ASSERT_EQ (ps.m_constraints.length (), 0);
+    ASSERT_EQ (ps.m_equiv_classes.length (), 2);
+  }
+
   // TODO: selftest for merging ecs "in the middle"
   // where a non-final one gets overwritten
 
@@ -1023,6 +1132,7 @@ void
 analyzer_constraints_cc_tests ()
 {
   test_constraint_conditions ();
+  test_constraint_conditions_2 ();
   test_constraint_impl ();
   test_assignment ();
 }
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/input.c b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/input.c
deleted file mode 100644
index cd13c29..0000000
--- a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/input.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-   Copyright 2012 David Malcolm <dmalcolm@redhat.com>
-   Copyright 2012 Red Hat, Inc.
-
-   This is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see
-   <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdlib.h>
-
-extern void marker_A(void);
-extern void marker_B(void);
-
-void test(void *ptr)
-{
-  marker_A();
-
-  /*
-     abort() is labelled with __attribute__ ((__noreturn__))
-  */
-  if (!ptr) {
-    abort();
-  }
-
-  /* Hence the fact-finder ought to know (ptr != 0) here: */
-  marker_B();
-}
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/script.py b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/script.py
deleted file mode 100644
index e71cf1d..0000000
--- a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/script.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# -*- coding: utf-8 -*-
-#   Copyright 2012, 2013 David Malcolm <dmalcolm@redhat.com>
-#   Copyright 2012, 2013 Red Hat, Inc.
-#
-#   This is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by
-#   the Free Software Foundation, either version 3 of the License, or
-#   (at your option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#   General Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License
-#   along with this program.  If not, see
-#   <http://www.gnu.org/licenses/>.
-
-from sm import main
-from sm.parser import parse_file
-
-def selftest(ctxt, solution):
-    if 0:
-        import sys
-        solution.dump(sys.stderr)
-
-    node = ctxt.find_call_of('marker_A')
-
-    node = ctxt.find_call_of('marker_B')
-    ctxt.assert_fact(node, 'ptr', '!=', 0)
-
-checker = parse_file('sm/checkers/malloc_checker.sm')
-main([checker], selftest=selftest)
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/stdout.txt b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/noreturn/abort/stdout.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/params/stdout.txt b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/params/stdout.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/input.c b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/input.c
deleted file mode 100644
index 98632c5..0000000
--- a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/input.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-   Copyright 2012 David Malcolm <dmalcolm@redhat.com>
-   Copyright 2012 Red Hat, Inc.
-
-   This is free software: you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see
-   <http://www.gnu.org/licenses/>.
-*/
-
-extern void marker_A(void);
-extern void marker_B(void);
-extern void marker_C(void);
-extern void marker_D(void);
-extern void marker_E(void);
-extern void marker_F(void);
-extern void marker_G(void);
-
-void test(int i)
-{
-  marker_A();
-
-  switch (i) {
-    case 0 ... 10: /* GCC's "case ranges" extension to C */
-    case 20 ... 30:
-      marker_B();
-      break;
-
-    case 0x42:
-    case 42:
-      marker_C();
-      break;
-
-    case 70:
-      marker_D();
-      /* fallthrough: */
-    case 80:
-      marker_E();
-      break;
-
-    default:
-      marker_F();
-      break;
-
-  }
-
-  marker_G();
-}
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/script.py b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/script.py
deleted file mode 100644
index 3fecff0..0000000
--- a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/script.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# -*- coding: utf-8 -*-
-#   Copyright 2012, 2013 David Malcolm <dmalcolm@redhat.com>
-#   Copyright 2012, 2013 Red Hat, Inc.
-#
-#   This is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by
-#   the Free Software Foundation, either version 3 of the License, or
-#   (at your option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#   General Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License
-#   along with this program.  If not, see
-#   <http://www.gnu.org/licenses/>.
-
-from sm import main
-from sm.parser import parse_file
-
-def selftest(ctxt, solution):
-    if 0:
-        import sys
-        solution.dump(sys.stderr)
-
-    node = ctxt.find_call_of('marker_A')
-
-    # Check that we know the constraints on i at each case label
-
-    # Combination of case ranges: 0 ... 10 and 20 ... 30
-    node = ctxt.find_call_of('marker_B')
-    ctxt.assert_fact(node, 'i', '>=', 0)
-    ctxt.assert_fact(node, 'i', '<=', 30)
-
-    # Combination of case labels 0x42 and 42:
-    node = ctxt.find_call_of('marker_C')
-    ctxt.assert_fact(node, 'i', '>=', 42)
-    ctxt.assert_fact(node, 'i', '<=', 0x42)
-
-    # Single case labels 70:
-    node = ctxt.find_call_of('marker_D')
-    ctxt.assert_fact(node, 'i', '==', 70)
-
-    # Case label 80 plus fallthrough of case label 70:
-    node = ctxt.find_call_of('marker_E')
-    # currently the fact-finder gives no information for the combination of
-    # the two:
-    ctxt.assert_no_facts(node)
-
-    # "default" gives no information:
-    node = ctxt.find_call_of('marker_F')
-    ctxt.assert_no_facts(node)
-
-    # Similarly, we have no information after control merges from all of
-    # the cases:
-    node = ctxt.find_call_of('marker_G')
-    ctxt.assert_no_facts(node)
-
-
-checker = parse_file('sm/checkers/malloc_checker.sm')
-main([checker], selftest=selftest)
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/stdout.txt b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/switch/various-cases/stdout.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/input.c b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/input.c
deleted file mode 100644
index 8b13789..0000000
--- a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/input.c
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/metadata.ini b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/metadata.ini
deleted file mode 100644
index ba7428c..0000000
--- a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/metadata.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[ExpectedBehavior]
-# This test case emits warnings on stderr;
-# don't treat the stderr output as leading to an expected failure:
-exitcode = 0
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/script.py b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/script.py
deleted file mode 100644
index 55013d5..0000000
--- a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/script.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# -*- coding: utf-8 -*-
-#   Copyright 2012 David Malcolm <dmalcolm@redhat.com>
-#   Copyright 2012 Red Hat, Inc.
-#
-#   This is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by
-#   the Free Software Foundation, either version 3 of the License, or
-#   (at your option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#   General Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License
-#   along with this program.  If not, see
-#   <http://www.gnu.org/licenses/>.
-
-import unittest
-
-from sm.facts import Facts, Fact
-
-def make_facts(factlist):
-    f = Facts()
-    f.set_ = set(factlist)
-    return f
-
-class FactsTests(unittest.TestCase):
-    def test_str(self):
-        f = make_facts([Fact('b', '==', 'c'),
-                        Fact('a', '==', 'b')])
-        self.assertEqual(str(f),
-                         '(a == b && b == c)')
-
-    def test_equivclasses(self):
-        f = make_facts([Fact('a', '==', 'b'),
-                        Fact('b', '==', 'c')])
-        self.assertEqual(f.get_equiv_classes(),
-                         frozenset([frozenset(['a', 'b', 'c'])]))
-
-        f = make_facts([Fact('a', '==', 'b'),
-                        Fact('c', '>', 0)])
-        self.assertEqual(f.get_equiv_classes(),
-                         frozenset([frozenset(['a', 'b'])]))
-
-        f = make_facts([Fact('a', '==', 'b'),
-                        Fact('c', '==', 0)])
-        self.assertEqual(f.get_equiv_classes(),
-                         frozenset([frozenset(['a', 'b']),
-                                    frozenset(['c', 0])]))
-
-        f = make_facts([Fact('a', '==', 'b'),
-                        Fact('c', '==', 'd'),
-                        Fact('c', '==', 'b')])
-        self.assertEqual(f.get_equiv_classes(),
-                         frozenset([frozenset(['a', 'b', 'c', 'd'])]))
-
-        f = make_facts([Fact('a', '==', 'b'),
-                        Fact('b', '==', 0),
-                        Fact('b', '!=', 1)])
-        self.assertEqual(f.get_equiv_classes(),
-                         frozenset([frozenset(['a', 'b', 0])]))
-
-    def test_aliases(self):
-        f = make_facts([Fact('a', '==', 'b'),
-                        Fact('b', '==', 'c')])
-        self.assertEqual(f.get_aliases('a'),
-                         frozenset(['a', 'b', 'c']))
-        self.assertEqual(f.get_aliases('d'),
-                         frozenset(['d']))
-
-class FakeContext:
-    def __init__(self, verbose=0):
-        self.verbose = verbose
-    def debug(self, msg, *args):
-        if self.verbose:
-            print(msg % args)
-
-class IsPossibleTests(unittest.TestCase):
-    def assertPossible(self, f):
-        self.assertEqual(f.is_possible(FakeContext()), True)
-
-    def assertNotPossible(self, f):
-        self.assertEqual(f.is_possible(FakeContext()), False)
-
-    def test_empty(self):
-        f = make_facts([])
-        self.assertPossible(f)
-
-    def test_single_values(self):
-        f = make_facts([Fact('a', '==', 'b'),
-                        Fact('b', '==', 0)])
-        self.assertPossible(f)
-
-    def test_inconsistent_equalities(self):
-        f = make_facts([Fact('a', '==', 'b'),
-                        Fact('b', '==', 0),
-                        Fact('b', '==', 1)])
-        self.assertNotPossible(f)
-
-    def test_inequalities(self):
-        f = make_facts([Fact('b', '==', 0),
-                        Fact('b', '!=', 1)])
-        self.assertPossible(f)
-
-        f = make_facts([Fact('b', '==', 0),
-                        Fact('b', '!=', 0)])
-        self.assertNotPossible(f)
-
-        f = make_facts([Fact('b', '==', 0),
-                        Fact('b', '>', 0)])
-        self.assertNotPossible(f)
-
-
-import sys
-sys.argv = ['foo', '-v']
-
-unittest.main()
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/stderr.txt b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/stderr.txt
deleted file mode 100644
index d8f2681..0000000
--- a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/stderr.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-test_aliases (__main__.FactsTests) ... ok
-test_equivclasses (__main__.FactsTests) ... ok
-test_str (__main__.FactsTests) ... ok
-test_empty (__main__.IsPossibleTests) ... ok
-test_inconsistent_equalities (__main__.IsPossibleTests) ... ok
-test_inequalities (__main__.IsPossibleTests) ... ok
-test_single_values (__main__.IsPossibleTests) ... ok
-
-----------------------------------------------------------------------
-Ran 7 tests in #s
-
-OK
diff --git a/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/stdout.txt b/gcc/testsuite/gcc.dg/TODO-analyzer/facts/unittests/stdout.txt
deleted file mode 100644
index e69de29..0000000
-- 
1.8.5.3

