- "len" => "r->length"}));
-is("*r->length", ParseExpr("*len", { "len" => "r->length"}));
-is("**r->length", ParseExpr("**len", { "len" => "r->length"}));
-is("r->length & 2", ParseExpr("len&2", { "len" => "r->length"}));
-is("&r->length", ParseExpr("&len", { "len" => "r->length"}));
-is("calc()", ParseExpr("calc()", { "foo" => "2"}));
-is("calc(2 * 2)", ParseExpr("calc(foo * 2)", { "foo" => "2"}));
-is("strlen(\"data\")", ParseExpr("strlen(foo)", { "foo" => "\"data\""}));
-is("strlen(\"data\", 4)", ParseExpr("strlen(foo, 4)", { "foo" => "\"data\""}));
-is("foo / bar", ParseExpr("foo / bar", { "bla" => "\"data\""}));
-is("r->length % 2", ParseExpr("len%2", { "len" => "r->length"}));
-is("r->length == 2", ParseExpr("len==2", { "len" => "r->length"}));
-is("r->length != 2", ParseExpr("len!=2", { "len" => "r->length"}));
-is("pr->length", ParseExpr("pr->length", { "p" => "r"}));
-is("r->length", ParseExpr("p->length", { "p" => "r"}));
-is("_foo / bla32", ParseExpr("_foo / bla32", { "bla" => "\"data\""}));
-is("foo.bar.blah", ParseExpr("foo.blah", { "foo" => "foo.bar"}));
-is("\"bla\"", ParseExpr("\"bla\"", {}));
-is("1 << 2", ParseExpr("1 << 2", {}));
-is("1 >> 2", ParseExpr("1 >> 2", {}));
-is("0x200", ParseExpr("0x200", {}));
-is("2?3:0", ParseExpr("2?3:0", {}));
-is("~0", ParseExpr("~0", {}));
-is("b->a->a", ParseExpr("a->a->a", {"a" => "b"}));
-is("b.a.a", ParseExpr("a.a.a", {"a" => "b"}));
+ "len" => "r->length"}, undef));
+is("*r->length", ParseExpr("*len", { "len" => "r->length"}, undef));
+is("**r->length", ParseExpr("**len", { "len" => "r->length"}, undef));
+is("r->length & 2", ParseExpr("len&2", { "len" => "r->length"}, undef));
+is("&r->length", ParseExpr("&len", { "len" => "r->length"}, undef));
+is("calc()", ParseExpr("calc()", { "foo" => "2"}, undef));
+is("calc(2 * 2)", ParseExpr("calc(foo * 2)", { "foo" => "2"}, undef));
+is("strlen(\"data\")", ParseExpr("strlen(foo)", { "foo" => "\"data\""}, undef));
+is("strlen(\"data\", 4)", ParseExpr("strlen(foo, 4)", { "foo" => "\"data\""}, undef));
+is("foo / bar", ParseExpr("foo / bar", { "bla" => "\"data\""}, undef));
+is("r->length % 2", ParseExpr("len%2", { "len" => "r->length"}, undef));
+is("r->length == 2", ParseExpr("len==2", { "len" => "r->length"}, undef));
+is("r->length != 2", ParseExpr("len!=2", { "len" => "r->length"}, undef));
+is("pr->length", ParseExpr("pr->length", { "p" => "r"}, undef));
+is("r->length", ParseExpr("p->length", { "p" => "r"}, undef));
+is("_foo / bla32", ParseExpr("_foo / bla32", { "bla" => "\"data\""}, undef));
+is("foo.bar.blah", ParseExpr("foo.blah", { "foo" => "foo.bar"}, undef));
+is("\"bla\"", ParseExpr("\"bla\"", {}, undef));
+is("1 << 2", ParseExpr("1 << 2", {}, undef));
+is("1 >> 2", ParseExpr("1 >> 2", {}, undef));
+is("0x200", ParseExpr("0x200", {}, undef));
+is("2?3:0", ParseExpr("2?3:0", {}, undef));
+is("~0", ParseExpr("~0", {}, undef));
+is("b->a->a", ParseExpr("a->a->a", {"a" => "b"}, undef));
+is("b.a.a", ParseExpr("a.a.a", {"a" => "b"}, undef));
+
+test_errors("nofile:0: Parse error in `~' near `~'\n", sub {
+ is(undef, ParseExpr("~", {}, {FILE => "nofile", LINE => 0})); });