From b9a1eb430b05c3deb87a00d856f96be5dc147d5f Mon Sep 17 00:00:00 2001
From: Virgile Prevosto <virgile.prevosto@m4x.org>
Date: Thu, 3 Oct 2019 16:03:50 +0200
Subject: [PATCH] [logic] fix qualifier parsing

---
 src/kernel_internals/parsing/logic_parser.mly |  4 ++--
 tests/spec/oracle/rm_qualifiers.res.oracle    | 14 ++++++++++++++
 tests/spec/rm_qualifiers.i                    | 11 +++++++++++
 3 files changed, 27 insertions(+), 2 deletions(-)
 create mode 100644 tests/spec/oracle/rm_qualifiers.res.oracle
 create mode 100644 tests/spec/rm_qualifiers.i

diff --git a/src/kernel_internals/parsing/logic_parser.mly b/src/kernel_internals/parsing/logic_parser.mly
index e5efe57447e..7d800ea9fe6 100644
--- a/src/kernel_internals/parsing/logic_parser.mly
+++ b/src/kernel_internals/parsing/logic_parser.mly
@@ -721,8 +721,8 @@ cv:
 
 type_spec_cv:
      type_spec { $1 }
-|    cv type_spec { LTattribute ($2, $1) }
-|    type_spec cv { LTattribute ($1, $2) }
+|    cv type_spec_cv { LTattribute ($2, $1) }
+|    type_spec_cv cv { LTattribute ($1, $2) }
 
 cast_logic_type:
  | type_spec_cv abs_spec_cv_option { $2 $1 }
diff --git a/tests/spec/oracle/rm_qualifiers.res.oracle b/tests/spec/oracle/rm_qualifiers.res.oracle
new file mode 100644
index 00000000000..c1fcfb54dce
--- /dev/null
+++ b/tests/spec/oracle/rm_qualifiers.res.oracle
@@ -0,0 +1,14 @@
+[kernel] Parsing tests/spec/rm_qualifiers.i (no preprocessing)
+[kernel] Parsing tests/spec/result/rm_qualifiers_res.i (no preprocessing)
+/* Generated by Frama-C */
+extern void G(void const *p);
+
+void *ptr;
+/*@ ensures ptr ≡ (void *)((int const volatile *)*(\old(ftab) + 1)); */
+void F(int const volatile (*ftab)[3], unsigned int const id)
+{
+  G((void const *)(*(ftab + 1)));
+  return;
+}
+
+
diff --git a/tests/spec/rm_qualifiers.i b/tests/spec/rm_qualifiers.i
new file mode 100644
index 00000000000..66d6d336519
--- /dev/null
+++ b/tests/spec/rm_qualifiers.i
@@ -0,0 +1,11 @@
+/* run.config
+OPT: @PTEST_FILE@ -ocode @PTEST_DIR@/result/@PTEST_NAME@_res.i -print -then @PTEST_DIR@/result/@PTEST_NAME@_res.i -ocode="" -print
+*/
+extern void G(const void* p);
+typedef volatile int ARR[42][3];
+void* ptr;
+
+//@ ensures ptr == (void *)ftab[1];
+void F(const ARR ftab, const unsigned id) {
+  G((void *)ftab[1]);
+}
-- 
GitLab