Skip to content

Commit 09727ab

Browse files
committed
Remove qualifierst
We only ever inherit from `c_qualifierst` and can safely avoid the use of `dynamic_cast` by making `expr2ct` use `c_qualifierst` instead of `qualifierst`. The `clone()` facility introduced in diffblue#1831 (where `qualifierst` was introduced) remains in place to support derived implementations (like `java_qualifierst`). Also, reduce the number of explicit `c_qualifierst()` calls by making use of `convert` and `convert_with_identifier`.
1 parent 3877e0f commit 09727ab

File tree

9 files changed

+40
-78
lines changed

9 files changed

+40
-78
lines changed

jbmc/src/java_bytecode/expr2java.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,11 @@ std::string expr2javat::convert_constant(
242242

243243
std::string expr2javat::convert_rec(
244244
const typet &src,
245-
const qualifierst &qualifiers,
245+
const c_qualifierst &qualifiers,
246246
const std::string &declarator)
247247
{
248-
std::unique_ptr<qualifierst> clone = qualifiers.clone();
249-
qualifierst &new_qualifiers = *clone;
248+
std::unique_ptr<c_qualifierst> clone = qualifiers.clone();
249+
c_qualifierst &new_qualifiers = *clone;
250250
new_qualifiers.read(src);
251251

252252
const std::string d = declarator.empty() ? declarator : (" " + declarator);

jbmc/src/java_bytecode/expr2java.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class expr2javat:public expr2ct
4242

4343
virtual std::string convert_rec(
4444
const typet &src,
45-
const qualifierst &qualifiers,
45+
const c_qualifierst &qualifiers,
4646
const std::string &declarator) override;
4747

4848
// length of string representation of Java Char

jbmc/src/java_bytecode/java_qualifiers.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ java_qualifierst &java_qualifierst::operator=(const java_qualifierst &other)
2020
return *this;
2121
}
2222

23-
std::unique_ptr<qualifierst> java_qualifierst::clone() const
23+
std::unique_ptr<c_qualifierst> java_qualifierst::clone() const
2424
{
2525
auto other = std::make_unique<java_qualifierst>(ns);
2626
*other = *this;

jbmc/src/java_bytecode/java_qualifiers.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class java_qualifierst : public c_qualifierst
2323
protected:
2424
java_qualifierst &operator=(const java_qualifierst &other);
2525
public:
26-
virtual std::unique_ptr<qualifierst> clone() const override;
26+
virtual std::unique_ptr<c_qualifierst> clone() const override;
2727

2828
java_qualifierst &operator+=(const java_qualifierst &other);
2929

src/ansi-c/c_qualifiers.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ c_qualifierst &c_qualifierst::operator=(const c_qualifierst &other)
2424
return *this;
2525
}
2626

27-
std::unique_ptr<qualifierst> c_qualifierst::clone() const
27+
std::unique_ptr<c_qualifierst> c_qualifierst::clone() const
2828
{
2929
auto other = std::make_unique<c_qualifierst>();
3030
*other = *this;
31-
return std::move(other);
31+
return other;
3232
}
3333

3434
std::string c_qualifierst::as_string() const
@@ -151,9 +151,3 @@ void c_qualifierst::clear(typet &dest)
151151
dest.remove(ID_C_nodiscard);
152152
dest.remove(ID_C_noreturn);
153153
}
154-
155-
/// pretty-print the qualifiers
156-
std::ostream &operator<<(std::ostream &out, const qualifierst &qualifiers)
157-
{
158-
return out << qualifiers.as_string();
159-
}

src/ansi-c/c_qualifiers.h

+9-39
Original file line numberDiff line numberDiff line change
@@ -16,39 +16,7 @@ Author: Daniel Kroening, [email protected]
1616

1717
class typet;
1818

19-
class qualifierst
20-
{
21-
protected:
22-
// Only derived classes can construct
23-
qualifierst() = default;
24-
25-
public:
26-
// Copy/move construction/assignment is deleted here and in derived classes
27-
qualifierst(const qualifierst &) = delete;
28-
qualifierst(qualifierst &&) = delete;
29-
qualifierst &operator=(const qualifierst &) = delete;
30-
qualifierst &operator=(qualifierst &&) = delete;
31-
32-
// Destruction is virtual
33-
virtual ~qualifierst() = default;
34-
35-
public:
36-
virtual std::unique_ptr<qualifierst> clone() const = 0;
37-
38-
virtual std::size_t count() const = 0;
39-
40-
virtual void clear() = 0;
41-
42-
virtual void read(const typet &src) = 0;
43-
virtual void write(typet &src) const = 0;
44-
45-
// String conversion
46-
virtual std::string as_string() const = 0;
47-
friend std::ostream &operator<<(std::ostream &, const qualifierst &);
48-
};
49-
50-
51-
class c_qualifierst : public qualifierst
19+
class c_qualifierst
5220
{
5321
public:
5422
c_qualifierst()
@@ -62,12 +30,14 @@ class c_qualifierst : public qualifierst
6230
read(src);
6331
}
6432

33+
virtual ~c_qualifierst() = default;
34+
6535
protected:
6636
c_qualifierst &operator=(const c_qualifierst &other);
6737
public:
68-
virtual std::unique_ptr<qualifierst> clone() const override;
38+
virtual std::unique_ptr<c_qualifierst> clone() const;
6939

70-
virtual void clear() override
40+
virtual void clear()
7141
{
7242
is_constant=false;
7343
is_volatile=false;
@@ -91,9 +61,9 @@ class c_qualifierst : public qualifierst
9161

9262
// will likely add alignment here as well
9363

94-
virtual std::string as_string() const override;
95-
virtual void read(const typet &src) override;
96-
virtual void write(typet &src) const override;
64+
virtual std::string as_string() const;
65+
virtual void read(const typet &src);
66+
virtual void write(typet &src) const;
9767

9868
static void clear(typet &dest);
9969

@@ -141,7 +111,7 @@ class c_qualifierst : public qualifierst
141111
return *this;
142112
}
143113

144-
virtual std::size_t count() const override
114+
virtual std::size_t count() const
145115
{
146116
return is_constant + is_volatile + is_restricted + is_atomic + is_ptr32 +
147117
is_ptr64 + is_nodiscard + is_noreturn;

src/ansi-c/expr2c.cpp

+11-13
Original file line numberDiff line numberDiff line change
@@ -213,16 +213,16 @@ void expr2ct::get_shorthands(const exprt &expr)
213213

214214
std::string expr2ct::convert(const typet &src)
215215
{
216-
return convert_rec(src, c_qualifierst(), "");
216+
return convert_with_identifier(src, "");
217217
}
218218

219219
std::string expr2ct::convert_rec(
220220
const typet &src,
221-
const qualifierst &qualifiers,
221+
const c_qualifierst &qualifiers,
222222
const std::string &declarator)
223223
{
224-
std::unique_ptr<qualifierst> clone = qualifiers.clone();
225-
c_qualifierst &new_qualifiers = dynamic_cast<c_qualifierst &>(*clone);
224+
std::unique_ptr<c_qualifierst> clone = qualifiers.clone();
225+
c_qualifierst &new_qualifiers = *clone;
226226
new_qualifiers.read(src);
227227

228228
std::string q=new_qualifiers.as_string();
@@ -379,7 +379,7 @@ std::string expr2ct::convert_rec(
379379
for(const auto &c : union_type.components())
380380
{
381381
dest += ' ';
382-
dest += convert_rec(c.type(), c_qualifierst(), id2string(c.get_name()));
382+
dest += convert_with_identifier(c.type(), id2string(c.get_name()));
383383
dest += ';';
384384
}
385385

@@ -538,7 +538,7 @@ std::string expr2ct::convert_rec(
538538
{
539539
std::string arg_declarator=
540540
convert(symbol_exprt(it->get_identifier(), it->type()));
541-
dest+=convert_rec(it->type(), c_qualifierst(), arg_declarator);
541+
dest += convert_with_identifier(it->type(), arg_declarator);
542542
}
543543
}
544544

@@ -692,10 +692,8 @@ std::string expr2ct::convert_struct_type(
692692
}
693693

694694
dest+=' ';
695-
dest+=convert_rec(
696-
component.type(),
697-
c_qualifierst(),
698-
id2string(component.get_name()));
695+
dest += convert_with_identifier(
696+
component.type(), id2string(component.get_name()));
699697
dest+=';';
700698
}
701699

@@ -715,7 +713,7 @@ std::string expr2ct::convert_struct_type(
715713
/// \return A C-like type declaration of an array
716714
std::string expr2ct::convert_array_type(
717715
const typet &src,
718-
const qualifierst &qualifiers,
716+
const c_qualifierst &qualifiers,
719717
const std::string &declarator_str)
720718
{
721719
return convert_array_type(
@@ -732,7 +730,7 @@ std::string expr2ct::convert_array_type(
732730
/// \return A C-like type declaration of an array
733731
std::string expr2ct::convert_array_type(
734732
const typet &src,
735-
const qualifierst &qualifiers,
733+
const c_qualifierst &qualifiers,
736734
const std::string &declarator_str,
737735
bool inc_size_if_possible)
738736
{
@@ -2850,7 +2848,7 @@ expr2ct::convert_code_frontend_decl(const codet &src, unsigned indent)
28502848
dest+="inline ";
28512849
}
28522850

2853-
dest+=convert_rec(src.op0().type(), c_qualifierst(), declarator);
2851+
dest += convert_with_identifier(src.op0().type(), declarator);
28542852

28552853
if(src.operands().size()==2)
28562854
dest+="="+convert(src.op1());

src/ansi-c/expr2c_class.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Author: Daniel Kroening, [email protected]
2424
#include <util/std_code.h>
2525

2626
class annotated_pointer_constant_exprt;
27-
class qualifierst;
27+
class c_qualifierst;
2828
class namespacet;
2929
class r_or_w_ok_exprt;
3030
class pointer_in_range_exprt;
@@ -57,7 +57,7 @@ class expr2ct
5757

5858
virtual std::string convert_rec(
5959
const typet &src,
60-
const qualifierst &qualifiers,
60+
const c_qualifierst &qualifiers,
6161
const std::string &declarator);
6262

6363
virtual std::string convert_struct_type(
@@ -74,12 +74,12 @@ class expr2ct
7474

7575
virtual std::string convert_array_type(
7676
const typet &src,
77-
const qualifierst &qualifiers,
77+
const c_qualifierst &qualifiers,
7878
const std::string &declarator_str);
7979

8080
std::string convert_array_type(
8181
const typet &src,
82-
const qualifierst &qualifiers,
82+
const c_qualifierst &qualifiers,
8383
const std::string &declarator_str,
8484
bool inc_size_if_possible);
8585

src/cpp/expr2cpp.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class expr2cppt:public expr2ct
4242

4343
std::string convert_rec(
4444
const typet &src,
45-
const qualifierst &qualifiers,
45+
const c_qualifierst &qualifiers,
4646
const std::string &declarator) override;
4747
};
4848

@@ -130,11 +130,11 @@ std::string expr2cppt::convert_constant(
130130

131131
std::string expr2cppt::convert_rec(
132132
const typet &src,
133-
const qualifierst &qualifiers,
133+
const c_qualifierst &qualifiers,
134134
const std::string &declarator)
135135
{
136-
std::unique_ptr<qualifierst> clone = qualifiers.clone();
137-
qualifierst &new_qualifiers = *clone;
136+
std::unique_ptr<c_qualifierst> clone = qualifiers.clone();
137+
c_qualifierst &new_qualifiers = *clone;
138138
new_qualifiers.read(src);
139139

140140
const std::string d = declarator.empty() ? declarator : (" " + declarator);
@@ -274,15 +274,15 @@ std::string expr2cppt::convert_rec(
274274
typet member;
275275
member.swap(tmp.add(ID_to_member));
276276

277-
std::string dest="("+convert_rec(member, c_qualifierst(), "")+":: *)";
277+
std::string dest = "(" + convert(member) + ":: *)";
278278

279279
const auto &base_type = to_pointer_type(src).base_type();
280280

281281
if(base_type.id() == ID_code)
282282
{
283283
const code_typet &code_type = to_code_type(base_type);
284284
const typet &return_type = code_type.return_type();
285-
dest=convert_rec(return_type, c_qualifierst(), "")+" "+dest;
285+
dest = convert(return_type) + " " + dest;
286286

287287
const code_typet::parameterst &args = code_type.parameters();
288288
dest+="(";
@@ -293,14 +293,14 @@ std::string expr2cppt::convert_rec(
293293
{
294294
if(it!=args.begin())
295295
dest+=", ";
296-
dest+=convert_rec(it->type(), c_qualifierst(), "");
296+
dest += convert(it->type());
297297
}
298298

299299
dest+=")";
300300
dest+=d;
301301
}
302302
else
303-
dest = convert_rec(base_type, c_qualifierst(), "") + " " + dest + d;
303+
dest = convert(base_type) + " " + dest + d;
304304

305305
return dest;
306306
}

0 commit comments

Comments
 (0)