cprover
cpp_scopes.cpp
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 #include "cpp_scopes.h"
13 
14 #include <ostream>
15 
17 {
18  unsigned prefix=++current_scope().compound_counter;
20 }
21 
23  const symbolt &symbol,
24  cpp_scopet &scope,
25  bool is_friend)
26 {
27  assert(!symbol.name.empty());
28  assert(!symbol.base_name.empty());
29 
30  // functions are also scopes
31  if(symbol.type.id()==ID_code)
32  {
33  cpp_scopest::id_mapt::iterator id_it = id_map.find(symbol.name);
34  if(id_it == id_map.end())
35  {
36  irep_idt block_base_name(std::string("$block:")+symbol.base_name.c_str());
37  cpp_idt &id = scope.insert(block_base_name);
39  id.identifier=symbol.name;
40  id.is_scope=true;
41  id.prefix = id2string(scope.prefix) + id2string(symbol.base_name) + "::";
42  id_map[symbol.name]=&id;
43  }
44  }
45 
46  // should go away, and be replaced by the 'tag only declaration' rule
47  if(is_friend)
48  {
49  cpp_save_scopet saved_scope(*this);
50  go_to(scope);
51 
52  cpp_idt &id=current_scope().insert(symbol.base_name);
53  id.identifier=symbol.name;
54  id.id_class = cpp_idt::id_classt::SYMBOL;
55  if(id_map.find(symbol.name)==id_map.end())
56  id_map[symbol.name]=&id;
57  return id;
58  }
59  else
60  {
61  cpp_idt &id=scope.insert(symbol.base_name);
62  id.identifier=symbol.name;
63  id.id_class = cpp_idt::id_classt::SYMBOL;
64  if(id_map.find(symbol.name)==id_map.end())
65  id_map[symbol.name]=&id;
66  return id;
67  }
68 }
69 
71 void cpp_scopest::print_current(std::ostream &out) const
72 {
73  const cpp_scopet *scope=current_scope_ptr;
74 
75  do
76  {
77  scope->print_fields(out);
78  out << '\n';
79  scope=&scope->get_parent();
80  }
81  while(!scope->is_root_scope());
82 }
Definition: cpp_id.h:28
irep_idt identifier
Definition: cpp_id.h:77
std::string prefix
Definition: cpp_id.h:84
id_classt id_class
Definition: cpp_id.h:50
void print_fields(std::ostream &out, unsigned indent=0) const
Definition: cpp_id.cpp:46
unsigned compound_counter
Definition: cpp_id.h:85
void go_to(cpp_idt &id)
Definition: cpp_scopes.h:104
void print_current(std::ostream &out) const
Definition: cpp_scopes.cpp:71
cpp_scopet & new_block_scope()
Definition: cpp_scopes.cpp:16
cpp_scopet * current_scope_ptr
Definition: cpp_scopes.h:71
cpp_scopet & current_scope()
Definition: cpp_scopes.h:33
cpp_scopet & new_scope(const irep_idt &new_scope_name, cpp_idt::id_classt id_class)
Definition: cpp_scopes.h:38
cpp_idt & put_into_scope(const symbolt &symbol, cpp_scopet &scope, bool is_friend=false)
Definition: cpp_scopes.cpp:22
id_mapt id_map
Definition: cpp_scopes.h:69
cpp_scopet & get_parent() const
Definition: cpp_scope.h:88
cpp_idt & insert(const irep_idt &_base_name)
Definition: cpp_scope.h:52
bool is_root_scope() const
Definition: cpp_scope.h:77
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:37
bool empty() const
Definition: dstring.h:88
const char * c_str() const
Definition: dstring.h:99
const irep_idt & id() const
Definition: irep.h:407
Symbol table entry.
Definition: symbol.h:28
irep_idt base_name
Base (non-scoped) name.
Definition: symbol.h:46
typet type
Type of symbol.
Definition: symbol.h:31
irep_idt name
The unique identifier.
Definition: symbol.h:40
C++ Language Type Checking.
const std::string & id2string(const irep_idt &d)
Definition: irep.h:49
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.