CBMC
cpp_declaration.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: C++ Language Type Checking
4 
5 Author: Daniel Kroening, kroening@cs.cmu.edu
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_CPP_CPP_DECLARATION_H
13 #define CPROVER_CPP_CPP_DECLARATION_H
14 
15 #include "cpp_declarator.h"
16 #include "cpp_storage_spec.h"
17 #include "cpp_member_spec.h"
18 #include "cpp_template_type.h"
19 #include "cpp_template_args.h"
20 
21 class cpp_declarationt:public exprt
22 {
23 public:
24  typedef std::vector<cpp_declaratort> declaratorst;
25 
26  cpp_declarationt():exprt(ID_cpp_declaration)
27  {
28  }
29 
30  bool is_empty() const
31  {
32  return type().is_nil() && !has_operands();
33  }
34 
35  bool is_constructor() const
36  {
37  return type().id()==ID_constructor;
38  }
39 
40  bool is_static_assert() const
41  {
42  return get_bool(ID_is_static_assert);
43  }
44 
45  bool is_destructor() const
46  {
47  return type().id()==ID_destructor;
48  }
49 
50  bool is_template() const
51  {
52  return get_bool(ID_is_template);
53  }
54 
55  bool is_class_template() const
56  {
57  return is_template() &&
58  type().id()==ID_struct &&
59  declarators().empty();
60  }
61 
62  const declaratorst &declarators() const
63  {
64  return (const declaratorst &)operands();
65  }
66 
68  {
69  return (declaratorst &)operands();
70  }
71 
73  {
74  return static_cast<const cpp_storage_spect &>(
75  find(ID_storage_spec));
76  }
77 
79  {
80  return static_cast<cpp_storage_spect &>(
81  add(ID_storage_spec));
82  }
83 
85  {
86  return static_cast<const cpp_member_spect &>(
87  find(ID_member_spec));
88  }
89 
91  {
92  return static_cast<cpp_member_spect &>(
93  add(ID_member_spec));
94  }
95 
97  {
98  return static_cast<template_typet &>(add(ID_template_type));
99  }
100 
102  {
103  return static_cast<const template_typet &>(find(ID_template_type));
104  }
105 
107  {
108  return static_cast<cpp_template_args_non_tct &>(
109  add(ID_partial_specialization_args));
110  }
111 
113  {
114  return static_cast<const cpp_template_args_non_tct &>(
115  find(ID_partial_specialization_args));
116  }
117 
119  {
120  set(ID_specialization_of, id);
121  }
122 
124  {
125  return get(ID_specialization_of);
126  }
127 
129  {
130  set(ID_is_typedef, true);
131  }
132 
133  bool is_typedef() const
134  {
135  return get_bool(ID_is_typedef);
136  }
137 
138  void output(std::ostream &out) const;
139 
140  // for assigning a tag for struct/union in the type based on
141  // the name of the first declarator
143  void name_anon_struct_union(typet &dest);
144 };
145 
147 {
148  assert(irep.id()==ID_cpp_declaration);
149  return static_cast<cpp_declarationt &>(irep);
150 }
151 
152 inline const cpp_declarationt &to_cpp_declaration(const irept &irep)
153 {
154  assert(irep.id()==ID_cpp_declaration);
155  return static_cast<const cpp_declarationt &>(irep);
156 }
157 
158 #endif // CPROVER_CPP_CPP_DECLARATION_H
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
cpp_declarationt::storage_spec
const cpp_storage_spect & storage_spec() const
Definition: cpp_declaration.h:72
cpp_storage_spect
Definition: cpp_storage_spec.h:17
cpp_declarationt::is_typedef
bool is_typedef() const
Definition: cpp_declaration.h:133
cpp_declarationt::declaratorst
std::vector< cpp_declaratort > declaratorst
Definition: cpp_declaration.h:24
cpp_declarationt::partial_specialization_args
const cpp_template_args_non_tct & partial_specialization_args() const
Definition: cpp_declaration.h:112
cpp_declarationt::is_empty
bool is_empty() const
Definition: cpp_declaration.h:30
cpp_declarationt::cpp_declarationt
cpp_declarationt()
Definition: cpp_declaration.h:26
typet
The type of an expression, extends irept.
Definition: type.h:28
to_cpp_declaration
cpp_declarationt & to_cpp_declaration(irept &irep)
Definition: cpp_declaration.h:146
irept::find
const irept & find(const irep_idt &name) const
Definition: irep.cpp:106
exprt
Base class for all expressions.
Definition: expr.h:55
cpp_declarationt::partial_specialization_args
cpp_template_args_non_tct & partial_specialization_args()
Definition: cpp_declaration.h:106
cpp_declarationt::is_destructor
bool is_destructor() const
Definition: cpp_declaration.h:45
cpp_template_args.h
cpp_member_spec.h
cpp_declarationt::name_anon_struct_union
void name_anon_struct_union()
Definition: cpp_declaration.h:142
cpp_declarationt::is_class_template
bool is_class_template() const
Definition: cpp_declaration.h:55
cpp_declarationt::get_specialization_of
irep_idt get_specialization_of() const
Definition: cpp_declaration.h:123
cpp_declarationt::member_spec
cpp_member_spect & member_spec()
Definition: cpp_declaration.h:90
cpp_storage_spec.h
cpp_declarationt::declarators
const declaratorst & declarators() const
Definition: cpp_declaration.h:62
cpp_declarationt::member_spec
const cpp_member_spect & member_spec() const
Definition: cpp_declaration.h:84
irept::get
const irep_idt & get(const irep_idt &name) const
Definition: irep.cpp:45
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
cpp_declarationt::template_type
const template_typet & template_type() const
Definition: cpp_declaration.h:101
exprt::has_operands
bool has_operands() const
Return true if there is at least one operand.
Definition: expr.h:91
irept::set
void set(const irep_idt &name, const irep_idt &value)
Definition: irep.h:420
cpp_declarationt::set_specialization_of
void set_specialization_of(const irep_idt &id)
Definition: cpp_declaration.h:118
cpp_declarationt
Definition: cpp_declaration.h:21
irept::is_nil
bool is_nil() const
Definition: irep.h:376
irept::id
const irep_idt & id() const
Definition: irep.h:396
cpp_declarator.h
cpp_declarationt::declarators
declaratorst & declarators()
Definition: cpp_declaration.h:67
cpp_declarationt::is_template
bool is_template() const
Definition: cpp_declaration.h:50
cpp_template_args_non_tct
Definition: cpp_template_args.h:44
irept::add
irept & add(const irep_idt &name)
Definition: irep.cpp:116
cpp_declarationt::is_constructor
bool is_constructor() const
Definition: cpp_declaration.h:35
cpp_declarationt::output
void output(std::ostream &out) const
Definition: cpp_declaration.cpp:16
cpp_declarationt::storage_spec
cpp_storage_spect & storage_spec()
Definition: cpp_declaration.h:78
cpp_declarationt::is_static_assert
bool is_static_assert() const
Definition: cpp_declaration.h:40
irept
There are a large number of kinds of tree structured or tree-like data in CPROVER.
Definition: irep.h:359
template_typet
Definition: cpp_template_type.h:18
exprt::operands
operandst & operands()
Definition: expr.h:94
cpp_member_spect
Definition: cpp_member_spec.h:16
cpp_declarationt::set_is_typedef
void set_is_typedef()
Definition: cpp_declaration.h:128
irept::get_bool
bool get_bool(const irep_idt &name) const
Definition: irep.cpp:58
cpp_declarationt::template_type
template_typet & template_type()
Definition: cpp_declaration.h:96
cpp_template_type.h