diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2004-08-12 01:04:59 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2004-08-12 01:04:59 +0000 |
commit | 9d060d918bdabd30c51e0c2efa85ef78b5e8be8a (patch) | |
tree | bb39f884b96efbad22ef0ca1957e900114e9e6c0 /perl_checker.src/parser_helper.ml | |
parent | 924739ea37144308b968db13b6302ed4e629a803 (diff) | |
download | perl-MDK-Common-9d060d918bdabd30c51e0c2efa85ef78b5e8be8a.tar perl-MDK-Common-9d060d918bdabd30c51e0c2efa85ef78b5e8be8a.tar.gz perl-MDK-Common-9d060d918bdabd30c51e0c2efa85ef78b5e8be8a.tar.bz2 perl-MDK-Common-9d060d918bdabd30c51e0c2efa85ef78b5e8be8a.tar.xz perl-MDK-Common-9d060d918bdabd30c51e0c2efa85ef78b5e8be8a.zip |
check lvalue validity
Diffstat (limited to 'perl_checker.src/parser_helper.ml')
-rw-r--r-- | perl_checker.src/parser_helper.ml | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/perl_checker.src/parser_helper.ml b/perl_checker.src/parser_helper.ml index a673f6d..a32e3fd 100644 --- a/perl_checker.src/parser_helper.ml +++ b/perl_checker.src/parser_helper.ml @@ -98,6 +98,23 @@ let is_always_false = function | Ident(None, "undef", _) -> true | _ -> false +let rec is_lvalue = function + | Call(Deref(I_func, Ident(None, f, _)), _) -> List.mem f [ "substr" ] + + | Call_op("?:", [ _ ; a ; b ], _) -> is_lvalue a && is_lvalue b + + | Call_op("local", l, _) + | List [ List l ] + -> List.for_all is_lvalue l + + | My_our _ + | Deref(_, _) + | Deref_with(_, _, _, _) + | Ident(None, "undef", _) + -> true + + | _ -> false + let not_complex e = if is_parenthesized e then true else let rec not_complex_ op = function @@ -728,6 +745,9 @@ let to_Call_op mcontext op para esp_start esp_end = let to_Call_op_ mcontext prio op para esp_start esp_end = let pos = raw_pos_range esp_start esp_end in new_any mcontext { priority = prio ; expr = cook_call_op op para pos } esp_start.spaces pos +let to_Call_assign_op_ mcontext prio op left right esp_left esp_end = + if not (is_lvalue left) then warn esp_left.pos "invalid lvalue"; + to_Call_op_ mcontext prio op [ left ; right ] esp_left esp_end let followed_by_comma expr true_comma = if true_comma then expr else |