aboutsummaryrefslogtreecommitdiffstats
path: root/test/regression/parsing.c
diff options
context:
space:
mode:
authorJacques-Henri Jourdan <jacques-henri.jourdan@inria.fr>2015-09-30 18:41:50 +0200
committerJacques-Henri Jourdan <jacques-henri.jourdan@inria.fr>2015-09-30 18:41:50 +0200
commit504228b1f7b875550eae9e3782a5f2c1033b0233 (patch)
treef3e5121f9694fb57974697475f88361b42da8330 /test/regression/parsing.c
parentc212ab7a8adea516db72f17d818393629dbde1b3 (diff)
downloadcompcert-kvx-504228b1f7b875550eae9e3782a5f2c1033b0233.tar.gz
compcert-kvx-504228b1f7b875550eae9e3782a5f2c1033b0233.zip
Fixed a few bugs in the pre parser. In particular, the following code
was not parsed correctly: typedef int a; int f() { for(int a; ;) if(1); a * x; } Additionnaly, I tried to add some comments in the pre-parser code, especially for the different hacks used to solve various conflicts.
Diffstat (limited to 'test/regression/parsing.c')
-rw-r--r--test/regression/parsing.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/test/regression/parsing.c b/test/regression/parsing.c
new file mode 100644
index 00000000..24b954c1
--- /dev/null
+++ b/test/regression/parsing.c
@@ -0,0 +1,104 @@
+#include<stdio.h>
+
+typedef signed int T;
+
+T f(T(T));
+T f(T a(T)) {
+ T b;
+ return 1;
+}
+int g(int x) {
+ T:;
+ T y;
+ T T;
+ T=1;
+
+ return 1;
+}
+
+void h() {
+ for(int T; ;)
+ if(1)
+ ;
+ T *x;
+ x = 0;
+}
+
+void h2() {
+ for(int T; ;)
+ if(1)
+ ;
+ else T;
+}
+
+struct S {
+ const T:3;
+ unsigned T:3;
+ const T:3;
+};
+
+void i() {
+ struct S s;
+ s.T = -1;
+ if(s.T < 0) printf("ERROR i\n");
+}
+
+/* These ones are parsed correctly, but rejected by the elaborator. */
+/* void j() { */
+/* typedef int I; */
+/* {sizeof(enum{I=2}); return I;} */
+/* {do sizeof(enum{I=2}); while((I)1);} */
+/* {if(1) return sizeof(enum{I=2}); */
+/* else return (I)1;} */
+/* {if(sizeof(enum{I=2})) return I; */
+/* else return I;} */
+/* {sizeof(enum{I=2})+I;} */
+/* {for(int i = sizeof(enum{I=2}); I; I) I; (I)1;} */
+/* } */
+/* int f2(enum{I=2} x) { */
+/* return I; */
+/* } */
+/* void k(A, B) */
+/* int B; */
+/* int A[B]; */
+/* { } */
+/* int l(A) */
+/* enum {T=1} A; */
+/* { return T * A; } */
+
+void m() {
+ if(0)
+ if(1);
+ else printf("ERROR m\n");
+ if(0)
+ for(int i; ; )
+ if(1);
+ else printf("ERROR m\n");
+ if(0)
+ for(1; ; )
+ if(1);
+ else printf("ERROR m\n");
+ if(0)
+ while(1)
+ if(1);
+ else printf("ERROR m\n");
+ if(0)
+ L: if(1);
+ else printf("ERROR m\n");
+
+ if(0)
+ LL:for(1;;)
+ for(int i;;)
+ while(1)
+ switch(1)
+ case 1:
+ if(1);
+ else printf("ERROR m\n");
+}
+
+int main () {
+ f(g);
+ i();
+ m();
+ return 0;
+}