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