cprover
Loading...
Searching...
No Matches
c_qualifiers.h
Go to the documentation of this file.
1/*******************************************************************\
2
3Module:
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
9
10#ifndef CPROVER_ANSI_C_C_QUALIFIERS_H
11#define CPROVER_ANSI_C_C_QUALIFIERS_H
12
13#include <iosfwd>
14#include <memory>
15#include <string>
16
17class typet;
18
20{
21protected:
22 // Only derived classes can construct
23 qualifierst() = default;
24
25public:
26 // Copy/move construction/assignment is deleted here and in derived classes
27 qualifierst(const qualifierst &) = delete;
29 qualifierst &operator=(const qualifierst &) = delete;
31
32 // Destruction is virtual
33 virtual ~qualifierst() = default;
34
35public:
36 virtual std::unique_ptr<qualifierst> clone() const = 0;
37
38 virtual qualifierst &operator+=(const qualifierst &b) = 0;
39
40 virtual std::size_t count() const = 0;
41
42 virtual void clear() = 0;
43
44 virtual void read(const typet &src) = 0;
45 virtual void write(typet &src) const = 0;
46
47 // Comparisons
48 virtual bool is_subset_of(const qualifierst &q) const = 0;
49 virtual bool operator==(const qualifierst &other) const = 0;
50 bool operator!=(const qualifierst &other) const
51 {
52 return !(*this == other);
53 }
54
55 // String conversion
56 virtual std::string as_string() const = 0;
57 friend std::ostream &operator<<(std::ostream &, const qualifierst &);
58};
59
60
62{
63public:
65 {
66 clear();
67 }
68
69 explicit c_qualifierst(const typet &src)
70 {
71 clear();
72 read(src);
73 }
74
75protected:
77public:
78 virtual std::unique_ptr<qualifierst> clone() const override;
79
80 virtual void clear() override
81 {
82 is_constant=false;
83 is_volatile=false;
84 is_restricted=false;
85 is_atomic=false;
86 is_ptr32=is_ptr64=false;
88 is_noreturn=false;
89 }
90
91 // standard ones
93
94 // MS Visual Studio extension
96
97 // gcc extension
99
100 // will likely add alignment here as well
101
102 virtual std::string as_string() const override;
103 virtual void read(const typet &src) override;
104 virtual void write(typet &src) const override;
105
106 static void clear(typet &dest);
107
108 virtual bool is_subset_of(const qualifierst &other) const override
109 {
110 const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
111 return
112 (!is_constant || cq->is_constant) &&
113 (!is_volatile || cq->is_volatile) &&
114 (!is_restricted || cq->is_restricted) &&
115 (!is_atomic || cq->is_atomic) &&
116 (!is_ptr32 || cq->is_ptr32) &&
117 (!is_ptr64 || cq->is_ptr64) &&
118 (!is_noreturn || cq->is_noreturn);
119
120 // is_transparent_union isn't checked
121 }
122
123 virtual bool operator==(const qualifierst &other) const override
124 {
125 const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
126 return
127 is_constant == cq->is_constant &&
128 is_volatile == cq->is_volatile &&
129 is_restricted == cq->is_restricted &&
130 is_atomic == cq->is_atomic &&
131 is_ptr32 == cq->is_ptr32 &&
132 is_ptr64 == cq->is_ptr64 &&
133 is_transparent_union == cq->is_transparent_union &&
134 is_noreturn == cq->is_noreturn;
135 }
136
137 virtual qualifierst &operator+=(const qualifierst &other) override
138 {
139 const c_qualifierst *cq = dynamic_cast<const c_qualifierst *>(&other);
140 is_constant |= cq->is_constant;
141 is_volatile |= cq->is_volatile;
142 is_restricted |= cq->is_restricted;
143 is_atomic |= cq->is_atomic;
144 is_ptr32 |= cq->is_ptr32;
145 is_ptr64 |= cq->is_ptr64;
146 is_transparent_union |= cq->is_transparent_union;
147 is_noreturn |= cq->is_noreturn;
148 return *this;
149 }
150
151 virtual std::size_t count() const override
152 {
155 }
156};
157
158#endif // CPROVER_ANSI_C_C_QUALIFIERS_H
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:564
virtual void clear() override
c_qualifierst(const typet &src)
virtual qualifierst & operator+=(const qualifierst &other) override
virtual std::string as_string() const override
virtual void write(typet &src) const override
virtual bool operator==(const qualifierst &other) const override
bool is_transparent_union
virtual std::size_t count() const override
virtual std::unique_ptr< qualifierst > clone() const override
virtual void read(const typet &src) override
c_qualifierst & operator=(const c_qualifierst &other)
virtual bool is_subset_of(const qualifierst &other) const override
qualifierst()=default
qualifierst(qualifierst &&)=delete
bool operator!=(const qualifierst &other) const
qualifierst & operator=(const qualifierst &)=delete
virtual std::size_t count() const =0
virtual void write(typet &src) const =0
virtual qualifierst & operator+=(const qualifierst &b)=0
virtual bool is_subset_of(const qualifierst &q) const =0
virtual std::unique_ptr< qualifierst > clone() const =0
virtual std::string as_string() const =0
friend std::ostream & operator<<(std::ostream &, const qualifierst &)
pretty-print the qualifiers
virtual void read(const typet &src)=0
virtual void clear()=0
virtual ~qualifierst()=default
qualifierst(const qualifierst &)=delete
qualifierst & operator=(qualifierst &&)=delete
virtual bool operator==(const qualifierst &other) const =0
The type of an expression, extends irept.
Definition type.h:29