Use enum for builtin types

This commit is contained in:
Jonathan Müller 2017-03-27 22:19:25 +02:00
commit c44e0b512e
13 changed files with 278 additions and 121 deletions

View file

@ -101,6 +101,43 @@ namespace cppast
std::string name_; std::string name_;
}; };
/// The C++ builtin types.
enum cpp_builtin_type_kind
{
cpp_void, //< `void`
cpp_bool, //< `bool`
cpp_uchar, //< `unsigned char`
cpp_ushort, //< `unsigned short`
cpp_uint, //< `unsigned int`
cpp_ulong, //< `unsigned long`
cpp_ulonglong, //< `unsigned long long`
cpp_uint128, //< `unsigned __int128`
cpp_schar, //< `signed char`
cpp_short, //< `short`
cpp_int, //< `int`
cpp_long, //< `long`
cpp_longlong, //< `long long`
cpp_int128, //< `__int128`
cpp_float, //< `float`
cpp_double, //< `double`
cpp_longdouble, //< `long double`
cpp_float128, //< `__float128`
cpp_char, //< `char`
cpp_wchar, //< `wchar_t`
cpp_char16, //< `char16_t`
cpp_char32, //< `char32_t`
cpp_nullptr, //< `decltype(nullptr)` aka `std::nullptr_t`
};
/// \returns The string representing the spelling of that type in the source code.
const char* to_string(cpp_builtin_type_kind kind) noexcept;
/// A builtin [cppast::cpp_type](). /// A builtin [cppast::cpp_type]().
/// ///
/// This is one where there is no associated [cppast::cpp_entity](). /// This is one where there is no associated [cppast::cpp_entity]().
@ -108,19 +145,19 @@ namespace cppast
{ {
public: public:
/// \returns A newly created builtin type. /// \returns A newly created builtin type.
static std::unique_ptr<cpp_builtin_type> build(std::string name) static std::unique_ptr<cpp_builtin_type> build(cpp_builtin_type_kind kind)
{ {
return std::unique_ptr<cpp_builtin_type>(new cpp_builtin_type(std::move(name))); return std::unique_ptr<cpp_builtin_type>(new cpp_builtin_type(kind));
} }
/// \returns The name of the type. /// \returns Which builtin type it is.
const std::string& name() const noexcept cpp_builtin_type_kind builtin_type_kind() const noexcept
{ {
return name_; return kind_;
} }
private: private:
cpp_builtin_type(std::string name) : name_(std::move(name)) cpp_builtin_type(cpp_builtin_type_kind kind) : kind_(kind)
{ {
} }
@ -129,7 +166,7 @@ namespace cppast
return cpp_type_kind::builtin; return cpp_type_kind::builtin;
} }
std::string name_; cpp_builtin_type_kind kind_;
}; };
/// \exclude /// \exclude

View file

@ -12,6 +12,67 @@
using namespace cppast; using namespace cppast;
const char* cppast::to_string(cpp_builtin_type_kind kind) noexcept
{
switch (kind)
{
case cpp_void:
return "void";
case cpp_bool:
return "bool";
case cpp_uchar:
return "unsigned char";
case cpp_ushort:
return "unsigned short";
case cpp_uint:
return "unsigned int";
case cpp_ulong:
return "unsigned long";
case cpp_ulonglong:
return "unsigned long long";
case cpp_uint128:
return "unsigned __int128";
case cpp_schar:
return "signed char";
case cpp_short:
return "short";
case cpp_int:
return "int";
case cpp_long:
return "long";
case cpp_longlong:
return "long long";
case cpp_int128:
return "__int128";
case cpp_float:
return "float";
case cpp_double:
return "double";
case cpp_longdouble:
return "long double";
case cpp_float128:
return "__float128";
case cpp_char:
return "char";
case cpp_wchar:
return "wchar_t";
case cpp_char16:
return "char16_t";
case cpp_char32:
return "char32_t";
case cpp_nullptr:
return "std::nullptr_t";
}
DEBUG_UNREACHABLE(detail::assert_handler{});
return "__ups";
}
bool detail::cpp_type_ref_predicate::operator()(const cpp_entity& e) bool detail::cpp_type_ref_predicate::operator()(const cpp_entity& e)
{ {
return is_type(e.kind()); return is_type(e.kind());

View file

@ -208,7 +208,7 @@ namespace
if (!detail::skip_if(stream, "noexcept")) if (!detail::skip_if(stream, "noexcept"))
return nullptr; return nullptr;
auto type = cpp_builtin_type::build("bool"); auto type = cpp_builtin_type::build(cpp_bool);
if (stream.peek().value() != "(") if (stream.peek().value() != "(")
return cpp_literal_expression::build(std::move(type), "true"); return cpp_literal_expression::build(std::move(type), "true");

View file

@ -196,7 +196,7 @@ namespace
{ {
auto size = clang_getArraySize(type); auto size = clang_getArraySize(type);
if (size != -1) if (size != -1)
return cpp_literal_expression::build(cpp_builtin_type::build("unsigned long long"), return cpp_literal_expression::build(cpp_builtin_type::build(cpp_ulonglong),
std::to_string(size)); std::to_string(size));
auto spelling = get_type_spelling(type); auto spelling = get_type_spelling(type);
@ -218,7 +218,7 @@ namespace
return size_expr.empty() ? return size_expr.empty() ?
nullptr : nullptr :
cpp_unexposed_expression::build(cpp_builtin_type::build("unsigned long long"), cpp_unexposed_expression::build(cpp_builtin_type::build(cpp_ulonglong),
std::string(size_expr.rbegin(), std::string(size_expr.rbegin(),
size_expr.rend())); size_expr.rend()));
} }
@ -503,31 +503,91 @@ namespace
return cpp_unexposed_type::build(get_type_spelling(type).c_str()); return cpp_unexposed_type::build(get_type_spelling(type).c_str());
case CXType_Void: case CXType_Void:
return make_leave_type(type,
[](std::string&&) { return cpp_builtin_type::build(cpp_void); });
case CXType_Bool: case CXType_Bool:
case CXType_Char_U: return make_leave_type(type,
[](std::string&&) { return cpp_builtin_type::build(cpp_bool); });
case CXType_UChar: case CXType_UChar:
case CXType_Char16: return make_leave_type(type, [](std::string&&) {
case CXType_Char32: return cpp_builtin_type::build(cpp_uchar);
});
case CXType_UShort: case CXType_UShort:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_ushort);
});
case CXType_UInt: case CXType_UInt:
return make_leave_type(type,
[](std::string&&) { return cpp_builtin_type::build(cpp_uint); });
case CXType_ULong: case CXType_ULong:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_ulong);
});
case CXType_ULongLong: case CXType_ULongLong:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_ulonglong);
});
case CXType_UInt128: case CXType_UInt128:
case CXType_Char_S: return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_uint128);
});
case CXType_SChar: case CXType_SChar:
case CXType_WChar: return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_schar);
});
case CXType_Short: case CXType_Short:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_short);
});
case CXType_Int: case CXType_Int:
return make_leave_type(type,
[](std::string&&) { return cpp_builtin_type::build(cpp_int); });
case CXType_Long: case CXType_Long:
return make_leave_type(type,
[](std::string&&) { return cpp_builtin_type::build(cpp_long); });
case CXType_LongLong: case CXType_LongLong:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_longlong);
});
case CXType_Int128: case CXType_Int128:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_int128);
});
case CXType_Float: case CXType_Float:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_float);
});
case CXType_Double: case CXType_Double:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_double);
});
case CXType_LongDouble: case CXType_LongDouble:
case CXType_NullPtr: return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_longdouble);
});
case CXType_Float128: case CXType_Float128:
return make_leave_type(type, [](std::string&& spelling) { return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(std::move(spelling)); return cpp_builtin_type::build(cpp_float128);
});
case CXType_Char_U:
case CXType_Char_S:
return make_leave_type(type,
[](std::string&&) { return cpp_builtin_type::build(cpp_char); });
case CXType_Char16:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_char16);
});
case CXType_Char32:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_char32);
});
case CXType_WChar:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_wchar);
});
case CXType_NullPtr:
return make_leave_type(type, [](std::string&&) {
return cpp_builtin_type::build(cpp_nullptr);
}); });
case CXType_Record: case CXType_Record:

View file

@ -46,7 +46,7 @@ using h = g<T, a>;
{ {
check_template_parameters(alias, {{cpp_entity_kind::template_type_parameter_t, "T"}}); check_template_parameters(alias, {{cpp_entity_kind::template_type_parameter_t, "T"}});
REQUIRE(equal_types(idx, alias.type_alias().underlying_type(), REQUIRE(equal_types(idx, alias.type_alias().underlying_type(),
*cpp_builtin_type::build("int"))); *cpp_builtin_type::build(cpp_int)));
} }
else if (alias.name() == "b") else if (alias.name() == "b")
{ {

View file

@ -57,8 +57,7 @@ enum c : int;
REQUIRE(expr.kind() == cpp_expression_kind::unexposed); REQUIRE(expr.kind() == cpp_expression_kind::unexposed);
REQUIRE(static_cast<const cpp_unexposed_expression&>(expr).expression() REQUIRE(static_cast<const cpp_unexposed_expression&>(expr).expression()
== "42"); == "42");
REQUIRE( REQUIRE(equal_types(idx, expr.type(), *cpp_builtin_type::build(cpp_uint)));
equal_types(idx, expr.type(), *cpp_builtin_type::build("unsigned int")));
} }
else if (val.name() == "a_d") else if (val.name() == "a_d")
{ {
@ -69,8 +68,7 @@ enum c : int;
REQUIRE(expr.kind() == cpp_expression_kind::unexposed); REQUIRE(expr.kind() == cpp_expression_kind::unexposed);
REQUIRE(static_cast<const cpp_unexposed_expression&>(expr).expression() REQUIRE(static_cast<const cpp_unexposed_expression&>(expr).expression()
== "a_a+2"); == "a_a+2");
REQUIRE( REQUIRE(equal_types(idx, expr.type(), *cpp_builtin_type::build(cpp_uint)));
equal_types(idx, expr.type(), *cpp_builtin_type::build("unsigned int")));
} }
else else
REQUIRE(false); REQUIRE(false);
@ -84,8 +82,8 @@ enum c : int;
if (e.is_definition()) if (e.is_definition())
{ {
REQUIRE(e.underlying_type()); REQUIRE(e.underlying_type());
REQUIRE( REQUIRE(equal_types(idx, e.underlying_type().value(),
equal_types(idx, e.underlying_type().value(), *cpp_builtin_type::build("int"))); *cpp_builtin_type::build(cpp_int)));
auto no_vals = 0u; auto no_vals = 0u;
for (auto& val : e) for (auto& val : e)
@ -103,7 +101,7 @@ enum c : int;
auto& expr = val.value().value(); auto& expr = val.value().value();
REQUIRE(expr.kind() == cpp_expression_kind::literal); REQUIRE(expr.kind() == cpp_expression_kind::literal);
REQUIRE(static_cast<const cpp_literal_expression&>(expr).value() == "42"); REQUIRE(static_cast<const cpp_literal_expression&>(expr).value() == "42");
REQUIRE(equal_types(idx, expr.type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, expr.type(), *cpp_builtin_type::build(cpp_int)));
} }
else else
REQUIRE(false); REQUIRE(false);
@ -128,7 +126,8 @@ enum c : int;
REQUIRE(e.is_declaration()); REQUIRE(e.is_declaration());
REQUIRE(!e.is_definition()); REQUIRE(!e.is_definition());
REQUIRE(!e.is_scoped()); REQUIRE(!e.is_scoped());
REQUIRE(equal_types(idx, e.underlying_type().value(), *cpp_builtin_type::build("int"))); REQUIRE(
equal_types(idx, e.underlying_type().value(), *cpp_builtin_type::build(cpp_int)));
REQUIRE(count_children(e) == 0u); REQUIRE(count_children(e) == 0u);
auto definition = get_definition(idx, e); auto definition = get_definition(idx, e);

View file

@ -65,32 +65,32 @@ void ns::l()
if (func.name() == "a") if (func.name() == "a")
{ {
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("void"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void)));
REQUIRE(count_children(func) == 0u); REQUIRE(count_children(func) == 0u);
REQUIRE(!func.is_variadic()); REQUIRE(!func.is_variadic());
} }
else if (func.name() == "b") else if (func.name() == "b")
{ {
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_int)));
auto count = 0u; auto count = 0u;
for (auto& param : func) for (auto& param : func)
{ {
if (param.name() == "a") if (param.name() == "a")
{ {
REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build(cpp_int)));
REQUIRE(!param.default_value()); REQUIRE(!param.default_value());
} }
else if (param.name() == "b") else if (param.name() == "b")
{ {
REQUIRE( REQUIRE(equal_types(idx, param.type(),
equal_types(idx, param.type(), *cpp_pointer_type::build( *cpp_pointer_type::build(
cpp_builtin_type::build("float")))); cpp_builtin_type::build(cpp_float))));
REQUIRE(param.default_value()); REQUIRE(param.default_value());
REQUIRE(equal_expressions(param.default_value().value(), REQUIRE(equal_expressions(param.default_value().value(),
*cpp_unexposed_expression:: *cpp_unexposed_expression::
build(cpp_pointer_type::build( build(cpp_pointer_type::build(
cpp_builtin_type::build("float")), cpp_builtin_type::build(cpp_float)),
"nullptr"))); "nullptr")));
} }
else else
@ -105,10 +105,10 @@ void ns::l()
REQUIRE( REQUIRE(
equal_types(idx, func.return_type(), equal_types(idx, func.return_type(),
*cpp_reference_type:: *cpp_reference_type::
build(cpp_array_type::build(cpp_builtin_type::build("int"), build(cpp_array_type::build(cpp_builtin_type::build(cpp_int),
cpp_literal_expression:: cpp_literal_expression::
build(cpp_builtin_type::build( build(cpp_builtin_type::build(
"unsigned long long"), cpp_ulonglong),
"10")), "10")),
cpp_ref_lvalue))); cpp_ref_lvalue)));
@ -121,7 +121,7 @@ void ns::l()
equal_types(idx, param.type(), equal_types(idx, param.type(),
*cpp_decltype_type::build( *cpp_decltype_type::build(
cpp_literal_expression::build(cpp_builtin_type::build( cpp_literal_expression::build(cpp_builtin_type::build(
"int"), cpp_int),
"42")))); "42"))));
REQUIRE(!param.default_value()); REQUIRE(!param.default_value());
} }
@ -135,7 +135,7 @@ void ns::l()
} }
else if (func.name() == "d" || func.name() == "e" || func.name() == "f") else if (func.name() == "d" || func.name() == "e" || func.name() == "f")
{ {
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("void"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void)));
REQUIRE(count_children(func) == 0u); REQUIRE(count_children(func) == 0u);
REQUIRE(!func.is_variadic()); REQUIRE(!func.is_variadic());
REQUIRE(func.storage_class() == cpp_storage_class_none); REQUIRE(func.storage_class() == cpp_storage_class_none);
@ -143,7 +143,7 @@ void ns::l()
REQUIRE(func.noexcept_condition()); REQUIRE(func.noexcept_condition());
check_body(func, cpp_function_declaration); check_body(func, cpp_function_declaration);
auto bool_t = cpp_builtin_type::build("bool"); auto bool_t = cpp_builtin_type::build(cpp_bool);
if (func.name() == "d") if (func.name() == "d")
REQUIRE( REQUIRE(
equal_expressions(func.noexcept_condition().value(), equal_expressions(func.noexcept_condition().value(),
@ -160,7 +160,7 @@ void ns::l()
else if (func.name() == "g" || func.name() == "h" || func.name() == "i" else if (func.name() == "g" || func.name() == "h" || func.name() == "i"
|| func.name() == "j") || func.name() == "j")
{ {
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("void"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void)));
REQUIRE(count_children(func) == 0u); REQUIRE(count_children(func) == 0u);
REQUIRE(!func.is_variadic()); REQUIRE(!func.is_variadic());
REQUIRE(!func.noexcept_condition()); REQUIRE(!func.noexcept_condition());
@ -189,7 +189,7 @@ void ns::l()
} }
else if (func.name() == "k" || func.name() == "l" || func.name() == "ns::l") else if (func.name() == "k" || func.name() == "l" || func.name() == "ns::l")
{ {
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("void"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void)));
REQUIRE(count_children(func) == 0u); REQUIRE(count_children(func) == 0u);
REQUIRE(!func.is_variadic()); REQUIRE(!func.is_variadic());
REQUIRE(!func.noexcept_condition()); REQUIRE(!func.noexcept_condition());
@ -234,7 +234,7 @@ void foo::a() {}
if (func.name() == "a" || func.name() == "foo::a") if (func.name() == "a" || func.name() == "foo::a")
{ {
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("void"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void)));
REQUIRE(!func.noexcept_condition()); REQUIRE(!func.noexcept_condition());
REQUIRE(!func.is_constexpr()); REQUIRE(!func.is_constexpr());
@ -245,18 +245,18 @@ void foo::a() {}
} }
else if (func.name() == "b") else if (func.name() == "b")
{ {
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_int)));
REQUIRE(func.noexcept_condition()); REQUIRE(func.noexcept_condition());
REQUIRE( REQUIRE(
equal_expressions(func.noexcept_condition().value(), equal_expressions(func.noexcept_condition().value(),
*cpp_literal_expression::build(cpp_builtin_type::build("bool"), *cpp_literal_expression::build(cpp_builtin_type::build(cpp_bool),
"true"))); "true")));
REQUIRE(!func.is_constexpr()); REQUIRE(!func.is_constexpr());
REQUIRE(func.body_kind() == cpp_function_definition); REQUIRE(func.body_kind() == cpp_function_definition);
} }
else if (func.name() == "c") else if (func.name() == "c")
{ {
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("char"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_char)));
REQUIRE(!func.noexcept_condition()); REQUIRE(!func.noexcept_condition());
REQUIRE(func.is_constexpr()); REQUIRE(func.is_constexpr());
REQUIRE(func.body_kind() == cpp_function_deleted); REQUIRE(func.body_kind() == cpp_function_deleted);

View file

@ -178,7 +178,7 @@ d::d(const int&);
REQUIRE(tfunc.function().kind() == cpp_entity_kind::function_t); REQUIRE(tfunc.function().kind() == cpp_entity_kind::function_t);
auto& func = static_cast<const cpp_function&>(tfunc.function()); auto& func = static_cast<const cpp_function&>(tfunc.function());
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_int)));
auto count = 0u; auto count = 0u;
for (auto& param : func) for (auto& param : func)
@ -188,7 +188,7 @@ d::d(const int&);
equal_types(idx, param.type(), equal_types(idx, param.type(),
*cpp_reference_type:: *cpp_reference_type::
build(cpp_cv_qualified_type::build(cpp_builtin_type::build( build(cpp_cv_qualified_type::build(cpp_builtin_type::build(
"int"), cpp_int),
cpp_cv_const), cpp_cv_const),
cpp_ref_lvalue))); cpp_ref_lvalue)));
} }
@ -210,7 +210,7 @@ d::d(const int&);
for (auto& param : func) for (auto& param : func)
{ {
++count; ++count;
REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build(cpp_int)));
} }
REQUIRE(count == 1u); REQUIRE(count == 1u);
} }
@ -222,7 +222,7 @@ d::d(const int&);
auto& func = static_cast<const cpp_member_function&>(tfunc.function()); auto& func = static_cast<const cpp_member_function&>(tfunc.function());
REQUIRE(func.cv_qualifier() == cpp_cv_none); REQUIRE(func.cv_qualifier() == cpp_cv_none);
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_int)));
} }
else if (tfunc.name() == "d::operator int") else if (tfunc.name() == "d::operator int")
{ {
@ -232,7 +232,7 @@ d::d(const int&);
auto& func = static_cast<const cpp_conversion_op&>(tfunc.function()); auto& func = static_cast<const cpp_conversion_op&>(tfunc.function());
REQUIRE(func.cv_qualifier() == cpp_cv_const); REQUIRE(func.cv_qualifier() == cpp_cv_const);
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_int)));
} }
else if (tfunc.name() == "d::d") else if (tfunc.name() == "d::d")
{ {
@ -249,7 +249,7 @@ d::d(const int&);
equal_types(idx, param.type(), equal_types(idx, param.type(),
*cpp_reference_type:: *cpp_reference_type::
build(cpp_cv_qualified_type::build(cpp_builtin_type::build( build(cpp_cv_qualified_type::build(cpp_builtin_type::build(
"int"), cpp_int),
cpp_cv_const), cpp_cv_const),
cpp_ref_lvalue))); cpp_ref_lvalue)));
} }

View file

@ -42,7 +42,7 @@ struct bar : foo
REQUIRE(count_children(func) == 0u); REQUIRE(count_children(func) == 0u);
REQUIRE(!func.is_variadic()); REQUIRE(!func.is_variadic());
REQUIRE(!func.is_constexpr()); REQUIRE(!func.is_constexpr());
REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build("void"))); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void)));
if (func.name() != "b") if (func.name() != "b")
REQUIRE(!func.noexcept_condition()); REQUIRE(!func.noexcept_condition());
if (func.name() != "g" && func.name() != "h") if (func.name() != "g" && func.name() != "h")
@ -60,7 +60,7 @@ struct bar : foo
REQUIRE(func.noexcept_condition()); REQUIRE(func.noexcept_condition());
REQUIRE( REQUIRE(
equal_expressions(func.noexcept_condition().value(), equal_expressions(func.noexcept_condition().value(),
*cpp_literal_expression::build(cpp_builtin_type::build("bool"), *cpp_literal_expression::build(cpp_builtin_type::build(cpp_bool),
"true"))); "true")));
REQUIRE(func.cv_qualifier() == cpp_cv_none); REQUIRE(func.cv_qualifier() == cpp_cv_none);
REQUIRE(func.ref_qualifier() == cpp_ref_none); REQUIRE(func.ref_qualifier() == cpp_ref_none);
@ -162,14 +162,14 @@ struct foo
{ {
REQUIRE(op.name() == "operator int&"); REQUIRE(op.name() == "operator int&");
REQUIRE(equal_types(idx, op.return_type(), REQUIRE(equal_types(idx, op.return_type(),
*cpp_reference_type::build(cpp_builtin_type::build("int"), *cpp_reference_type::build(cpp_builtin_type::build(cpp_int),
cpp_ref_lvalue))); cpp_ref_lvalue)));
REQUIRE(op.cv_qualifier() == cpp_cv_none); REQUIRE(op.cv_qualifier() == cpp_cv_none);
} }
else if (op.is_explicit() && !op.is_constexpr()) else if (op.is_explicit() && !op.is_constexpr())
{ {
REQUIRE(op.name() == "operator bool"); REQUIRE(op.name() == "operator bool");
REQUIRE(equal_types(idx, op.return_type(), *cpp_builtin_type::build("bool"))); REQUIRE(equal_types(idx, op.return_type(), *cpp_builtin_type::build(cpp_bool)));
REQUIRE(op.cv_qualifier() == cpp_cv_const); REQUIRE(op.cv_qualifier() == cpp_cv_const);
} }
else if (!op.is_explicit() && op.is_constexpr()) else if (!op.is_explicit() && op.is_constexpr())
@ -209,7 +209,7 @@ struct foo
REQUIRE(cont.noexcept_condition()); REQUIRE(cont.noexcept_condition());
REQUIRE( REQUIRE(
equal_expressions(cont.noexcept_condition().value(), equal_expressions(cont.noexcept_condition().value(),
*cpp_literal_expression::build(cpp_builtin_type::build("bool"), *cpp_literal_expression::build(cpp_builtin_type::build(cpp_bool),
"true"))); "true")));
REQUIRE(!cont.is_explicit()); REQUIRE(!cont.is_explicit());
REQUIRE(!cont.is_constexpr()); REQUIRE(!cont.is_constexpr());
@ -275,10 +275,10 @@ struct d : c
REQUIRE(!dtor.is_virtual()); REQUIRE(!dtor.is_virtual());
REQUIRE(dtor.body_kind() == cpp_function_definition); REQUIRE(dtor.body_kind() == cpp_function_definition);
REQUIRE(dtor.noexcept_condition()); REQUIRE(dtor.noexcept_condition());
REQUIRE( REQUIRE(equal_expressions(dtor.noexcept_condition().value(),
equal_expressions(dtor.noexcept_condition().value(), *cpp_unexposed_expression::build(cpp_builtin_type::build(
*cpp_unexposed_expression::build(cpp_builtin_type::build("bool"), cpp_bool),
"false"))); "false")));
} }
else if (dtor.name() == "~c") else if (dtor.name() == "~c")
{ {

View file

@ -24,18 +24,18 @@ struct foo
auto count = test_visit<cpp_member_variable>(*file, [&](const cpp_member_variable& var) { auto count = test_visit<cpp_member_variable>(*file, [&](const cpp_member_variable& var) {
if (var.name() == "a") if (var.name() == "a")
{ {
auto type = cpp_builtin_type::build("int"); auto type = cpp_builtin_type::build(cpp_int);
REQUIRE(equal_types(idx, var.type(), *type)); REQUIRE(equal_types(idx, var.type(), *type));
REQUIRE(!var.default_value()); REQUIRE(!var.default_value());
REQUIRE(!var.is_mutable()); REQUIRE(!var.is_mutable());
} }
else if (var.name() == "b") else if (var.name() == "b")
{ {
auto type = cpp_builtin_type::build("float"); auto type = cpp_builtin_type::build(cpp_float);
REQUIRE(equal_types(idx, var.type(), *type)); REQUIRE(equal_types(idx, var.type(), *type));
// all initializers are unexposed // all initializers are unexposed
auto def = cpp_unexposed_expression::build(cpp_builtin_type::build("float"), "3.14f"); auto def = cpp_unexposed_expression::build(cpp_builtin_type::build(cpp_float), "3.14f");
REQUIRE(var.default_value()); REQUIRE(var.default_value());
REQUIRE(equal_expressions(var.default_value().value(), *def)); REQUIRE(equal_expressions(var.default_value().value(), *def));
@ -43,7 +43,7 @@ struct foo
} }
else if (var.name() == "c") else if (var.name() == "c")
{ {
auto type = cpp_builtin_type::build("char"); auto type = cpp_builtin_type::build(cpp_char);
REQUIRE(equal_types(idx, var.type(), *type)); REQUIRE(equal_types(idx, var.type(), *type));
REQUIRE(!var.default_value()); REQUIRE(!var.default_value());
REQUIRE(var.is_mutable()); REQUIRE(var.is_mutable());
@ -70,7 +70,7 @@ struct foo
auto file = parse({}, "cpp_bitfield.cpp", code); auto file = parse({}, "cpp_bitfield.cpp", code);
auto count = test_visit<cpp_bitfield>(*file, [&](const cpp_bitfield& bf) { auto count = test_visit<cpp_bitfield>(*file, [&](const cpp_bitfield& bf) {
REQUIRE(!bf.default_value()); REQUIRE(!bf.default_value());
REQUIRE(equal_types({}, bf.type(), *cpp_builtin_type::build("char"))); REQUIRE(equal_types({}, bf.type(), *cpp_builtin_type::build(cpp_char)));
if (bf.name() == "a") if (bf.name() == "a")
{ {

View file

@ -37,7 +37,7 @@ using e = void;
auto file = parse(idx, "cpp_template_type_parameter.cpp", code); auto file = parse(idx, "cpp_template_type_parameter.cpp", code);
auto count = test_visit<cpp_alias_template>(*file, [&](const cpp_alias_template& alias) { auto count = test_visit<cpp_alias_template>(*file, [&](const cpp_alias_template& alias) {
REQUIRE(equal_types(idx, alias.type_alias().underlying_type(), REQUIRE(equal_types(idx, alias.type_alias().underlying_type(),
*cpp_builtin_type::build("void"))); *cpp_builtin_type::build(cpp_void)));
for (auto& p : alias.parameters()) for (auto& p : alias.parameters())
{ {
@ -112,7 +112,7 @@ using d = void;
auto file = parse(idx, "cpp_non_type_template_parameter.cpp", code); auto file = parse(idx, "cpp_non_type_template_parameter.cpp", code);
auto count = test_visit<cpp_alias_template>(*file, [&](const cpp_alias_template& alias) { auto count = test_visit<cpp_alias_template>(*file, [&](const cpp_alias_template& alias) {
REQUIRE(equal_types(idx, alias.type_alias().underlying_type(), REQUIRE(equal_types(idx, alias.type_alias().underlying_type(),
*cpp_builtin_type::build("void"))); *cpp_builtin_type::build(cpp_void)));
for (auto& p : alias.parameters()) for (auto& p : alias.parameters())
{ {
@ -122,7 +122,7 @@ using d = void;
if (param.name() == "A") if (param.name() == "A")
{ {
REQUIRE(alias.name() == "a"); REQUIRE(alias.name() == "a");
REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build(cpp_int)));
REQUIRE(!param.is_variadic()); REQUIRE(!param.is_variadic());
REQUIRE(!param.default_value()); REQUIRE(!param.default_value());
} }
@ -130,18 +130,18 @@ using d = void;
{ {
REQUIRE(alias.name() == "b"); REQUIRE(alias.name() == "b");
REQUIRE(equal_types(idx, param.type(), REQUIRE(equal_types(idx, param.type(),
*cpp_pointer_type::build(cpp_builtin_type::build("char")))); *cpp_pointer_type::build(cpp_builtin_type::build(cpp_char))));
REQUIRE(!param.is_variadic()); REQUIRE(!param.is_variadic());
REQUIRE(param.default_value()); REQUIRE(param.default_value());
REQUIRE(equal_expressions(param.default_value().value(), REQUIRE(equal_expressions(param.default_value().value(),
*cpp_literal_expression::build(cpp_builtin_type::build( *cpp_literal_expression::build(cpp_builtin_type::build(
"nullptr_t"), cpp_nullptr),
"nullptr"))); "nullptr")));
} }
else if (param.name() == "C") else if (param.name() == "C")
{ {
REQUIRE(alias.name() == "c"); REQUIRE(alias.name() == "c");
REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build(cpp_int)));
REQUIRE(param.is_variadic()); REQUIRE(param.is_variadic());
REQUIRE(!param.default_value()); REQUIRE(!param.default_value());
} }
@ -149,7 +149,7 @@ using d = void;
{ {
REQUIRE(alias.name() == "d"); REQUIRE(alias.name() == "d");
cpp_function_type::builder builder(cpp_builtin_type::build("void")); cpp_function_type::builder builder(cpp_builtin_type::build(cpp_void));
builder.is_variadic(); builder.is_variadic();
REQUIRE(equal_types(idx, param.type(), *cpp_pointer_type::build(builder.finish()))); REQUIRE(equal_types(idx, param.type(), *cpp_pointer_type::build(builder.finish())));
@ -190,7 +190,7 @@ using d = void;
auto file = parse(idx, "cpp_template_template_parameter.cpp", code); auto file = parse(idx, "cpp_template_template_parameter.cpp", code);
auto count = test_visit<cpp_alias_template>(*file, [&](const cpp_alias_template& alias) { auto count = test_visit<cpp_alias_template>(*file, [&](const cpp_alias_template& alias) {
REQUIRE(equal_types(idx, alias.type_alias().underlying_type(), REQUIRE(equal_types(idx, alias.type_alias().underlying_type(),
*cpp_builtin_type::build("void"))); *cpp_builtin_type::build(cpp_void)));
if (alias.name() == "def") if (alias.name() == "def")
return; return;

View file

@ -22,8 +22,8 @@ bool equal_types(const cpp_entity_index& idx, const cpp_type& parsed, const cpp_
switch (parsed.kind()) switch (parsed.kind())
{ {
case cpp_type_kind::builtin: case cpp_type_kind::builtin:
return static_cast<const cpp_builtin_type&>(parsed).name() return static_cast<const cpp_builtin_type&>(parsed).builtin_type_kind()
== static_cast<const cpp_builtin_type&>(synthesized).name(); == static_cast<const cpp_builtin_type&>(synthesized).builtin_type_kind();
case cpp_type_kind::user_defined: case cpp_type_kind::user_defined:
{ {
@ -299,7 +299,7 @@ typedef decltype(0) w;
}; };
auto make_size = [](std::string size, bool literal) -> std::unique_ptr<cpp_expression> { auto make_size = [](std::string size, bool literal) -> std::unique_ptr<cpp_expression> {
auto type = cpp_builtin_type::build("unsigned long long"); auto type = cpp_builtin_type::build(cpp_ulonglong);
if (literal) if (literal)
return cpp_literal_expression::build(std::move(type), std::move(size)); return cpp_literal_expression::build(std::move(type), std::move(size));
else else
@ -311,41 +311,41 @@ typedef decltype(0) w;
auto count = test_visit<cpp_type_alias>(*file, [&](const cpp_type_alias& alias) { auto count = test_visit<cpp_type_alias>(*file, [&](const cpp_type_alias& alias) {
if (alias.name() == "a") if (alias.name() == "a")
{ {
auto type = cpp_builtin_type::build("int"); auto type = cpp_builtin_type::build(cpp_int);
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "b") else if (alias.name() == "b")
{ {
auto type = add_cv(cpp_builtin_type::build("long double"), cpp_cv_const_volatile); auto type = add_cv(cpp_builtin_type::build(cpp_longdouble), cpp_cv_const_volatile);
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "c") else if (alias.name() == "c")
{ {
auto type = cpp_pointer_type::build(cpp_builtin_type::build("int")); auto type = cpp_pointer_type::build(cpp_builtin_type::build(cpp_int));
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "d") else if (alias.name() == "d")
{ {
auto type = cpp_pointer_type::build( auto type =
add_cv(cpp_builtin_type::build("unsigned int"), cpp_cv_const)); cpp_pointer_type::build(add_cv(cpp_builtin_type::build(cpp_uint), cpp_cv_const));
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "e") else if (alias.name() == "e")
{ {
auto type = add_cv(cpp_pointer_type::build( auto type = add_cv(cpp_pointer_type::build(
add_cv(cpp_builtin_type::build("unsigned int"), cpp_cv_const)), add_cv(cpp_builtin_type::build(cpp_uint), cpp_cv_const)),
cpp_cv_volatile); cpp_cv_volatile);
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "f") else if (alias.name() == "f")
{ {
auto type = cpp_reference_type::build(cpp_builtin_type::build("int"), cpp_ref_lvalue); auto type = cpp_reference_type::build(cpp_builtin_type::build(cpp_int), cpp_ref_lvalue);
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "g") else if (alias.name() == "g")
{ {
auto type = auto type =
cpp_reference_type::build(add_cv(cpp_builtin_type::build("int"), cpp_cv_const), cpp_reference_type::build(add_cv(cpp_builtin_type::build(cpp_int), cpp_cv_const),
cpp_ref_rvalue); cpp_ref_rvalue);
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
@ -369,26 +369,26 @@ typedef decltype(0) w;
else if (alias.name() == "k") else if (alias.name() == "k")
{ {
auto type = auto type =
cpp_array_type::build(cpp_builtin_type::build("int"), make_size("42", true)); cpp_array_type::build(cpp_builtin_type::build(cpp_int), make_size("42", true));
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "l") else if (alias.name() == "l")
{ {
auto type = auto type =
cpp_array_type::build(cpp_pointer_type::build(cpp_builtin_type::build("float")), cpp_array_type::build(cpp_pointer_type::build(cpp_builtin_type::build(cpp_float)),
nullptr); nullptr);
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "m") else if (alias.name() == "m")
{ {
auto type = auto type =
cpp_array_type::build(cpp_builtin_type::build("char"), make_size("42", true)); cpp_array_type::build(cpp_builtin_type::build(cpp_char), make_size("42", true));
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else if (alias.name() == "n") else if (alias.name() == "n")
{ {
cpp_function_type::builder builder(cpp_builtin_type::build("void")); cpp_function_type::builder builder(cpp_builtin_type::build(cpp_void));
builder.add_parameter(cpp_builtin_type::build("int")); builder.add_parameter(cpp_builtin_type::build(cpp_int));
auto type = cpp_pointer_type::build(builder.finish()); auto type = cpp_pointer_type::build(builder.finish());
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
@ -396,9 +396,9 @@ typedef decltype(0) w;
else if (alias.name() == "o") else if (alias.name() == "o")
{ {
cpp_function_type::builder builder( cpp_function_type::builder builder(
cpp_pointer_type::build(cpp_builtin_type::build("char"))); cpp_pointer_type::build(cpp_builtin_type::build(cpp_char)));
builder.add_parameter( builder.add_parameter(
cpp_reference_type::build(add_cv(cpp_builtin_type::build("int"), cpp_cv_const), cpp_reference_type::build(add_cv(cpp_builtin_type::build(cpp_int), cpp_cv_const),
cpp_ref_lvalue)); cpp_ref_lvalue));
builder.is_variadic(); builder.is_variadic();
auto type = cpp_reference_type::build(builder.finish(), cpp_ref_lvalue); auto type = cpp_reference_type::build(builder.finish(), cpp_ref_lvalue);
@ -409,7 +409,7 @@ typedef decltype(0) w;
{ {
cpp_function_type::builder builder( cpp_function_type::builder builder(
cpp_user_defined_type::build(cpp_type_ref(cpp_entity_id(""), "n"))); cpp_user_defined_type::build(cpp_type_ref(cpp_entity_id(""), "n")));
builder.add_parameter(cpp_builtin_type::build("int")); builder.add_parameter(cpp_builtin_type::build(cpp_int));
builder.add_parameter( builder.add_parameter(
cpp_user_defined_type::build(cpp_type_ref(cpp_entity_id(""), "o"))); cpp_user_defined_type::build(cpp_type_ref(cpp_entity_id(""), "o")));
auto type = cpp_pointer_type::build(builder.finish()); auto type = cpp_pointer_type::build(builder.finish());
@ -420,8 +420,8 @@ typedef decltype(0) w;
{ {
cpp_member_function_type::builder builder(cpp_user_defined_type::build( cpp_member_function_type::builder builder(cpp_user_defined_type::build(
cpp_type_ref(cpp_entity_id(""), "foo")), cpp_type_ref(cpp_entity_id(""), "foo")),
cpp_builtin_type::build("void")); cpp_builtin_type::build(cpp_void));
builder.add_parameter(cpp_builtin_type::build("int")); builder.add_parameter(cpp_builtin_type::build(cpp_int));
auto type = cpp_pointer_type::build(builder.finish()); auto type = cpp_pointer_type::build(builder.finish());
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
@ -434,8 +434,8 @@ typedef decltype(0) w;
cpp_ref_lvalue); cpp_ref_lvalue);
cpp_member_function_type::builder builder(std::move(obj), cpp_member_function_type::builder builder(std::move(obj),
cpp_builtin_type::build("void")); cpp_builtin_type::build(cpp_void));
builder.add_parameter(cpp_builtin_type::build("int")); builder.add_parameter(cpp_builtin_type::build(cpp_int));
builder.is_variadic(); builder.is_variadic();
auto type = cpp_pointer_type::build(builder.finish()); auto type = cpp_pointer_type::build(builder.finish());
@ -471,7 +471,7 @@ typedef decltype(0) w;
else if (alias.name() == "w") else if (alias.name() == "w")
{ {
auto type = cpp_decltype_type::build( auto type = cpp_decltype_type::build(
cpp_literal_expression::build(cpp_builtin_type::build("int"), "0")); cpp_literal_expression::build(cpp_builtin_type::build(cpp_int), "0"));
REQUIRE(equal_types(idx, alias.underlying_type(), *type)); REQUIRE(equal_types(idx, alias.underlying_type(), *type));
} }
else else

View file

@ -72,21 +72,21 @@ const decltype(o)& p = o;
auto file = parse(idx, "cpp_variable.cpp", code); auto file = parse(idx, "cpp_variable.cpp", code);
auto int_type = cpp_builtin_type::build("int"); auto int_type = cpp_builtin_type::build(cpp_int);
auto count = test_visit<cpp_variable>(*file, [&](const cpp_variable& var) { auto count = test_visit<cpp_variable>(*file, [&](const cpp_variable& var) {
if (var.name() == "a") if (var.name() == "a")
check_variable(var, *int_type, nullptr, cpp_storage_class_none, false, false); check_variable(var, *int_type, nullptr, cpp_storage_class_none, false, false);
else if (var.name() == "b") else if (var.name() == "b")
check_variable(var, *cpp_builtin_type::build("unsigned long long"), check_variable(var, *cpp_builtin_type::build(cpp_ulonglong),
// unexposed due to implicit cast, I think // unexposed due to implicit cast, I think
type_safe::ref( type_safe::ref(
*cpp_unexposed_expression::build(cpp_builtin_type::build("int"), *cpp_unexposed_expression::build(cpp_builtin_type::build(cpp_int),
"42")), "42")),
cpp_storage_class_none, false, false); cpp_storage_class_none, false, false);
else if (var.name() == "c") else if (var.name() == "c")
check_variable(var, *cpp_builtin_type::build("float"), check_variable(var, *cpp_builtin_type::build(cpp_float),
type_safe::ref( type_safe::ref(
*cpp_unexposed_expression::build(cpp_builtin_type::build("float"), *cpp_unexposed_expression::build(cpp_builtin_type::build(cpp_float),
"3.f+0.14f")), "3.f+0.14f")),
cpp_storage_class_none, false, false); cpp_storage_class_none, false, false);
else if (var.name() == "d") else if (var.name() == "d")
@ -99,10 +99,10 @@ const decltype(o)& p = o;
check_variable(var, *int_type, nullptr, check_variable(var, *int_type, nullptr,
cpp_storage_class_static | cpp_storage_class_thread_local, false, false); cpp_storage_class_static | cpp_storage_class_thread_local, false, false);
else if (var.name() == "h") else if (var.name() == "h")
check_variable(var, *cpp_cv_qualified_type::build(cpp_builtin_type::build("int"), check_variable(var, *cpp_cv_qualified_type::build(cpp_builtin_type::build(cpp_int),
cpp_cv_const), cpp_cv_const),
type_safe::ref( type_safe::ref(
*cpp_literal_expression::build(cpp_builtin_type::build("int"), *cpp_literal_expression::build(cpp_builtin_type::build(cpp_int),
"12")), "12")),
cpp_storage_class_none, true, false); cpp_storage_class_none, true, false);
else if (var.name() == "i") else if (var.name() == "i")
@ -135,7 +135,7 @@ const decltype(o)& p = o;
else if (var.name() == "m") else if (var.name() == "m")
check_variable(var, *cpp_auto_type::build(), check_variable(var, *cpp_auto_type::build(),
type_safe::ref( type_safe::ref(
*cpp_literal_expression::build(cpp_builtin_type::build("int"), *cpp_literal_expression::build(cpp_builtin_type::build(cpp_int),
"128")), "128")),
cpp_storage_class_none, false, false); cpp_storage_class_none, false, false);
else if (var.name() == "n") else if (var.name() == "n")
@ -144,25 +144,25 @@ const decltype(o)& p = o;
cpp_cv_const), cpp_cv_const),
cpp_ref_lvalue), cpp_ref_lvalue),
type_safe::ref( type_safe::ref(
*cpp_unexposed_expression::build(cpp_builtin_type::build("int"), *cpp_unexposed_expression::build(cpp_builtin_type::build(cpp_int),
"m")), "m")),
cpp_storage_class_none, false, false); cpp_storage_class_none, false, false);
else if (var.name() == "o") else if (var.name() == "o")
check_variable(var, check_variable(var, *cpp_decltype_type::build(
*cpp_decltype_type::build( cpp_literal_expression::build(cpp_builtin_type::build(cpp_int),
cpp_literal_expression::build(cpp_builtin_type::build("int"), "0")), "0")),
nullptr, cpp_storage_class_none, false, false); nullptr, cpp_storage_class_none, false, false);
else if (var.name() == "p") else if (var.name() == "p")
check_variable(var, check_variable(var, *cpp_reference_type::
*cpp_reference_type:: build(cpp_cv_qualified_type::
build(cpp_cv_qualified_type:: build(cpp_decltype_type::build(
build(cpp_decltype_type::build( cpp_unexposed_expression::
cpp_unexposed_expression:: build(cpp_builtin_type::build(cpp_int),
build(cpp_builtin_type::build("int"), "o")), "o")),
cpp_cv_const), cpp_cv_const),
cpp_ref_lvalue), cpp_ref_lvalue),
type_safe::ref( type_safe::ref(
*cpp_unexposed_expression::build(cpp_builtin_type::build("int"), *cpp_unexposed_expression::build(cpp_builtin_type::build(cpp_int),
"o")), "o")),
cpp_storage_class_none, false, false); cpp_storage_class_none, false, false);
else else
@ -191,14 +191,14 @@ struct test
REQUIRE(is_static(var.storage_class())); REQUIRE(is_static(var.storage_class()));
if (var.name() == "a") if (var.name() == "a")
REQUIRE(equal_types({}, var.type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types({}, var.type(), *cpp_builtin_type::build(cpp_int)));
else if (var.name() == "b") else if (var.name() == "b")
REQUIRE(equal_types({}, var.type(), REQUIRE(equal_types({}, var.type(),
*cpp_cv_qualified_type::build(cpp_builtin_type::build("int"), *cpp_cv_qualified_type::build(cpp_builtin_type::build(cpp_int),
cpp_cv_const))); cpp_cv_const)));
else if (var.name() == "c") else if (var.name() == "c")
{ {
REQUIRE(equal_types({}, var.type(), *cpp_builtin_type::build("int"))); REQUIRE(equal_types({}, var.type(), *cpp_builtin_type::build(cpp_int)));
REQUIRE(is_thread_local(var.storage_class())); REQUIRE(is_thread_local(var.storage_class()));
} }
else else