From 7b36ca2464e909a9f5e5adf7f7e405d609adc105 Mon Sep 17 00:00:00 2001 From: klaas Date: Tue, 17 Jul 2018 09:52:12 -0400 Subject: [PATCH 1/2] Moves is_lvalue to expr_util.c This change exposes is_lvalue for use outside of goto-programs/builtin_functions.cpp. --- src/goto-programs/builtin_functions.cpp | 15 +-------------- src/util/expr_util.cpp | 13 +++++++++++++ src/util/expr_util.h | 3 +++ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/goto-programs/builtin_functions.cpp b/src/goto-programs/builtin_functions.cpp index cbe45869e06..0d258c3cb6b 100644 --- a/src/goto-programs/builtin_functions.cpp +++ b/src/goto-programs/builtin_functions.cpp @@ -17,6 +17,7 @@ Author: Daniel Kroening, kroening@kroening.com #include #include #include +#include #include #include #include @@ -615,20 +616,6 @@ void goto_convertt::do_array_op( copy(array_op_statement, OTHER, dest); } -bool is_lvalue(const exprt &expr) -{ - if(expr.id()==ID_index) - return is_lvalue(to_index_expr(expr).op0()); - else if(expr.id()==ID_member) - return is_lvalue(to_member_expr(expr).op0()); - else if(expr.id()==ID_dereference) - return true; - else if(expr.id()==ID_symbol) - return true; - else - return false; -} - exprt make_va_list(const exprt &expr) { // we first strip any typecast diff --git a/src/util/expr_util.cpp b/src/util/expr_util.cpp index 8d3c3ca3d59..b72630489f7 100644 --- a/src/util/expr_util.cpp +++ b/src/util/expr_util.cpp @@ -19,6 +19,19 @@ Author: Daniel Kroening, kroening@kroening.com #include "namespace.h" #include "arith_tools.h" +bool is_lvalue(const exprt &expr) +{ + if(expr.id() == ID_index) + return is_lvalue(to_index_expr(expr).op0()); + else if(expr.id() == ID_member) + return is_lvalue(to_member_expr(expr).op0()); + else if(expr.id() == ID_dereference) + return true; + else if(expr.id() == ID_symbol) + return true; + else + return false; +} exprt make_binary(const exprt &expr) { const exprt::operandst &operands=expr.operands(); diff --git a/src/util/expr_util.h b/src/util/expr_util.h index 5c7d37b0b95..aea069e5ee1 100644 --- a/src/util/expr_util.h +++ b/src/util/expr_util.h @@ -30,6 +30,9 @@ class symbolt; class typet; class namespacet; +/// Returns true iff the argument is (syntactically) an lvalue. +bool is_lvalue(const exprt &expr); + /// splits an expression with >=3 operands into nested binary expressions exprt make_binary(const exprt &); From f212505bb18a46ddfbd3616e540edacc9bcc76d5 Mon Sep 17 00:00:00 2001 From: klaas Date: Tue, 31 Jul 2018 09:10:25 -0400 Subject: [PATCH 2/2] Avoids using expr.op0 when type is known --- src/util/expr_util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/expr_util.cpp b/src/util/expr_util.cpp index b72630489f7..0fd9f6dd5dc 100644 --- a/src/util/expr_util.cpp +++ b/src/util/expr_util.cpp @@ -22,9 +22,9 @@ Author: Daniel Kroening, kroening@kroening.com bool is_lvalue(const exprt &expr) { if(expr.id() == ID_index) - return is_lvalue(to_index_expr(expr).op0()); + return is_lvalue(to_index_expr(expr).array()); else if(expr.id() == ID_member) - return is_lvalue(to_member_expr(expr).op0()); + return is_lvalue(to_member_expr(expr).compound()); else if(expr.id() == ID_dereference) return true; else if(expr.id() == ID_symbol)