Fix return type having same name as function

This commit is contained in:
Jonathan Müller 2017-07-04 08:25:50 +02:00
commit 98e709fdfc
3 changed files with 34 additions and 7 deletions

View file

@ -50,7 +50,7 @@ namespace cppast
/// \returns A source location where entity and file name is available. /// \returns A source location where entity and file name is available.
static source_location make_entity(std::string entity, std::string file) static source_location make_entity(std::string entity, std::string file)
{ {
return {std::move(entity), std::move(file), type_safe::nullopt}; return {std::move(entity), std::move(file), type_safe::nullopt, type_safe::nullopt};
} }
/// \returns A possible string representation of the source location. /// \returns A possible string representation of the source location.

View file

@ -229,16 +229,19 @@ namespace
bool is_friend = false; bool is_friend = false;
}; };
bool prefix_end(detail::cxtoken_stream& stream, const char* name, bool is_ctor) bool prefix_end(detail::cxtoken_stream& stream, const char* name, bool is_ctor_dtor)
{ {
auto cur = stream.cur(); auto cur = stream.cur();
// name can have multiple tokens if it is an operator // name can have multiple tokens if it is an operator
if (!detail::skip_if(stream, name, true)) if (!detail::skip_if(stream, name, true))
return false; return false;
else if (stream.peek() == "," || stream.peek() == ">" || stream.peek() == ">>") else if (stream.peek() == "," || stream.peek() == ">" || stream.peek() == ">>")
{
// argument to template parameters // argument to template parameters
stream.set_cur(cur);
return false; return false;
else if (is_ctor) }
else if (is_ctor_dtor)
{ {
// need to make sure it is not actually a class name // need to make sure it is not actually a class name
if (stream.peek() == "::") if (stream.peek() == "::")
@ -269,15 +272,22 @@ namespace
else else
return true; return true;
} }
else if (std::strcmp(name, "operator") != 0 && stream.peek().kind() == CXToken_Identifier)
{
// can't be function name
stream.set_cur(cur);
return false;
}
else else
return true; return true;
} }
prefix_info parse_prefix_info(detail::cxtoken_stream& stream, const char* name, bool is_ctor) prefix_info parse_prefix_info(detail::cxtoken_stream& stream, const char* name,
bool is_ctor_dtor)
{ {
prefix_info result; prefix_info result;
while (!stream.done() && !prefix_end(stream, name, is_ctor)) while (!stream.done() && !prefix_end(stream, name, is_ctor_dtor))
{ {
if (detail::skip_if(stream, "constexpr")) if (detail::skip_if(stream, "constexpr"))
result.is_constexpr = true; result.is_constexpr = true;
@ -811,7 +821,7 @@ std::unique_ptr<cpp_entity> detail::parse_cpp_destructor(const detail::parse_con
detail::cxtokenizer tokenizer(context.tu, context.file, cur); detail::cxtokenizer tokenizer(context.tu, context.file, cur);
detail::cxtoken_stream stream(tokenizer, cur); detail::cxtoken_stream stream(tokenizer, cur);
auto prefix_info = parse_prefix_info(stream, "~", false); auto prefix_info = parse_prefix_info(stream, "~", true);
DEBUG_ASSERT(!prefix_info.is_constexpr && !prefix_info.is_explicit, detail::assert_handler{}); DEBUG_ASSERT(!prefix_info.is_constexpr && !prefix_info.is_explicit, detail::assert_handler{});
auto name = std::string("~") + stream.get().c_str(); auto name = std::string("~") + stream.get().c_str();

View file

@ -48,6 +48,8 @@ namespace ns
/// void l(); /// void l();
void l(); void l();
using m = int;
} }
/// void ns::l(); /// void ns::l();
@ -56,6 +58,9 @@ void ns::l()
// might confuse parser // might confuse parser
auto b = noexcept(g()); auto b = noexcept(g());
} }
/// ns::m m();
ns::m m();
)"; )";
auto check_body = [](const cpp_function& func, cpp_function_body_kind kind) { auto check_body = [](const cpp_function& func, cpp_function_body_kind kind) {
@ -223,10 +228,22 @@ void ns::l()
check_body(func, cpp_function_declaration); check_body(func, cpp_function_declaration);
} }
} }
else if (func.name() == "m")
{
REQUIRE(equal_types(idx, func.return_type(),
*cpp_user_defined_type::build(
cpp_type_ref(cpp_entity_id(""), "ns::m"))));
REQUIRE(count_children(func.parameters()) == 0u);
REQUIRE(!func.is_variadic());
REQUIRE(!func.noexcept_condition());
REQUIRE(!func.is_constexpr());
REQUIRE(func.storage_class() == cpp_storage_class_none);
check_body(func, cpp_function_declaration);
}
else else
REQUIRE(false); REQUIRE(false);
}); });
REQUIRE(count == 13u); REQUIRE(count == 14u);
} }
TEST_CASE("static cpp_function") TEST_CASE("static cpp_function")