Skip to content

Commit 917f9a0

Browse files
committed
exprt::with_source_location: conditionally copy source location
This helper will copy the source location from another expression, if it has any. Implemented as a fluent interface, with a first specialisation for array_exprt. Other expression types an use with_source_location<X_exprt> or add specialisations.
1 parent efb9284 commit 917f9a0

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

src/util/expr.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,30 @@ class exprt:public irept
9898
const operandst &operands() const
9999
{ return (const operandst &)get_sub(); }
100100

101+
/// Add the source location from \p other, if it has any.
102+
template <typename T>
103+
T &with_source_location(const exprt &other) &
104+
{
105+
static_assert(
106+
std::is_base_of<exprt, T>::value,
107+
"The template argument T must be derived from exprt.");
108+
if(other.source_location().is_not_nil())
109+
add_source_location() = other.source_location();
110+
return *static_cast<T *>(this);
111+
}
112+
113+
/// Add the source location from \p other, if it has any.
114+
template <typename T>
115+
T &&with_source_location(const exprt &other) &&
116+
{
117+
static_assert(
118+
std::is_base_of<exprt, T>::value,
119+
"The template argument T must be derived from exprt.");
120+
if(other.source_location().is_not_nil())
121+
add_source_location() = other.source_location();
122+
return std::move(*static_cast<T *>(this));
123+
}
124+
101125
protected:
102126
exprt &op0()
103127
{ return operands().front(); }

src/util/std_expr.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,16 @@ class array_exprt : public multi_ary_exprt
15711571
{
15721572
return static_cast<array_typet &>(multi_ary_exprt::type());
15731573
}
1574+
1575+
array_exprt &with_source_location(const exprt &other) &
1576+
{
1577+
return exprt::with_source_location<array_exprt>(other);
1578+
}
1579+
1580+
array_exprt &&with_source_location(const exprt &other) &&
1581+
{
1582+
return std::move(*this).exprt::with_source_location<array_exprt>(other);
1583+
}
15741584
};
15751585

15761586
template <>

src/util/string_constant.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,5 @@ array_exprt string_constantt::to_array_expr() const
5353
*it = from_integer(ch, char_type);
5454
}
5555

56-
if(source_location().is_not_nil())
57-
dest.add_source_location() = source_location();
58-
59-
return dest;
56+
return std::move(dest).with_source_location(*this);
6057
}

0 commit comments

Comments
 (0)