more validations
authorMichael Wallner <mike@php.net>
Tue, 16 Feb 2016 12:24:13 +0000 (13:24 +0100)
committerMichael Wallner <mike@php.net>
Tue, 16 Feb 2016 12:24:13 +0000 (13:24 +0100)
src/context_validate.c
tests/parser/validate001.phpt [new file with mode: 0644]

index 897ae657799e5a3ad30c2f72480f535b9e8916c6..a5d3604d4a9e3e1ee3e43ba03e00e0f18c3e25ac 100644 (file)
@@ -181,7 +181,7 @@ static inline int validate_decl_typedef(PSI_Data *data, decl_arg *def) {
                }
                data->error(data, def->token, PSI_WARNING,
                        "Type '%s' cannot be aliased to %s'%s'",
-                       def->type->name, pre, def->var->name);
+                       def->var->name, pre, def->type->name);
                return 0;
        }
        if (def->type->type == PSI_T_VOID) {
@@ -393,7 +393,7 @@ static inline int validate_decl_struct(PSI_Data *data, decl_struct *s) {
 
        if (!s->size && !s->args->count) {
                data->error(data, s->token, PSI_WARNING,
-                               "Cannot compute size of empty struct %s",
+                               "Cannot compute size of empty struct '%s'",
                                s->name);
                return 0;
        }
diff --git a/tests/parser/validate001.phpt b/tests/parser/validate001.phpt
new file mode 100644 (file)
index 0000000..f9869a8
--- /dev/null
@@ -0,0 +1,98 @@
+--TEST--
+validate types
+--SKIPIF--
+<?php 
+extension_loaded("psi") or die("skip - need ext/psi");
+?>
+--FILE--
+===TEST===
+<?php 
+function validate($check, $psi) {
+       $file = __DIR__."/001.psi";
+       file_put_contents($file, $psi);
+       if ($check !== psi_validate($file)) {
+               echo "Assertion failed!\n";
+       }
+}
+
+validate(false, "typedef void foo;");
+validate(true, "typedef void *bar;");
+validate(false, "typedef long int;");
+validate(true, "typedef long foo;");
+validate(false, "typedef struct foo bar;");
+validate(true, "typedef struct {int a;} foo;");
+validate(false, "struct a; \n typedef struct a a_t;");
+validate(true, "struct a::(8,8); \n typedef struct a a_t;");
+validate(true, "typedef struct a a_t; \n struct a::(8,8);");
+
+validate(true,
+<<<PSI
+enum {
+       A,
+       B,
+       C
+}
+PSI
+);
+validate(false,
+<<<PSI
+enum {
+       A,
+       B = A + 2,
+       C = X
+}
+PSI
+);
+
+validate(true,
+<<<PSI
+struct a {
+       int i;
+}
+struct b {
+       long l;
+}
+typedef struct b b;
+union v {
+       struct a a;
+       b b;
+       struct {
+               double d;
+       } s;
+       union {
+               long l;
+               double d;
+       } u;
+}
+PSI
+);
+
+validate(true, "typedef int foo(int bar);");
+validate(true, "typedef int (foo)(int bar);");
+validate(true, "typedef int (*foo)(int bar);");
+validate(true, "typedef int *(*foo)(int bar);");
+validate(false, "typedef int *(*foo)(int *(*bar)(int baz));");
+validate(true, "typedef int *(*bar)(int baz); \n typedef int *(*foo)(bar bar);");
+validate(false, "typedef int bar(int baz); \n typedef int *(*foo)(bar bar);");
+
+?>
+===DONE===
+--CLEAN--
+<?php
+@unlink(__DIR__."/001.psi");
+?>
+--EXPECTF--
+===TEST===
+
+Warning: PSI syntax error: Unexpected token ';' in %s001.psi on line 1
+
+Warning: PSI syntax error: Unexpected token 'int' in %s001.psi on line 1
+
+Warning: Type 'bar' cannot be aliased to struct 'foo' in %s001.psi on line 1
+
+Warning: Cannot compute size of empty struct 'a' in %s001.psi on line 1
+
+Warning: Unknown variable 'X' in numeric expression in %s001.psi on line 4
+
+Warning: PSI syntax error: Unexpected token '(' in %s001.psi on line 1
+===DONE===