See More

/*******************************************************************\ Module: C++ Language Type Checking Author: Daniel Kroening, [email protected] \*******************************************************************/ /// \file /// C++ Language Type Checking #include #include #include "cpp_typecheck.h" void cpp_typecheckt::convert(cpp_namespace_spect &namespace_spec) { // save the scope cpp_save_scopet saved_scope(cpp_scopes); const irep_idt &name=namespace_spec.get_namespace(); if(name.empty()) { // "unique namespace" error().source_location=namespace_spec.source_location(); error() << "unique namespace not supported yet" << eom; throw 0; } irep_idt final_name(name); std::string identifier= cpp_scopes.current_scope().prefix+id2string(final_name); symbol_table_baset::symbolst::const_iterator it = symbol_table.symbols.find(identifier); if(it!=symbol_table.symbols.end()) { if(namespace_spec.alias().is_not_nil()) { error().source_location=namespace_spec.source_location(); error() << "namespace alias '" << final_name << "' previously declared\n" << "location of previous declaration: " << it->second.location << eom; throw 0; } if(it->second.type.id()!=ID_namespace) { error().source_location=namespace_spec.source_location(); error() << "namespace '" << final_name << "' previously declared\n" << "location of previous declaration: " << it->second.location << eom; throw 0; } // enter that scope cpp_scopes.set_scope(it->first); } else { symbolt symbol{identifier, typet(ID_namespace), ID_cpp}; symbol.base_name=final_name; symbol.location=namespace_spec.source_location(); symbol.module=module; if(!symbol_table.insert(std::move(symbol)).second) { error().source_location=symbol.location; error() << "cpp_typecheckt::convert_namespace: symbol_table.move() failed" << eom; throw 0; } cpp_scopes.new_namespace(final_name); } if(namespace_spec.alias().is_not_nil()) { cpp_typecheck_resolvet resolver(*this); cpp_scopet &s=resolver.resolve_namespace(namespace_spec.alias()); cpp_scopes.current_scope().add_using_scope(s); } else { // do the declarations for(auto &item : namespace_spec.items()) convert(item); } }