/*******************************************************************\
Module: C++ Language Type Checking
Author: Daniel Kroening, [email protected]
\*******************************************************************/
/// \file
/// C++ Language Type Checking
#include "cpp_declarator.h"
#include
#include
void cpp_declaratort::output(std::ostream &out) const
{
out << " name: " << name().pretty() << '\n';
out << " type: " << type().pretty() << '\n';
out << " value: " << value().pretty() << '\n';
out << " init_args: " << init_args().pretty() << '\n';
out << " method_qualifier: " << method_qualifier().pretty() << '\n';
}
typet cpp_declaratort::merge_type(const typet &declaration_type) const
{
typet dest_type=type();
if(declaration_type.id()=="cpp-cast-operator")
return dest_type;
typet *p=&dest_type;
// walk down subtype until we hit nil
while(true)
{
typet &t=*p;
if(t.is_nil())
{
t=declaration_type;
break;
}
else if(t.id()==ID_merged_type)
{
// the chain continues with the last one
auto &merged_type = to_merged_type(t);
p = &merged_type.last_type();
}
else
{
DATA_INVARIANT(!t.id().empty(), "empty type");
p = &t.add_subtype();
}
}
return dest_type;
}