From b5a5e42955da16453acbfab6281df54a45466382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Thu, 15 Jun 2017 21:08:36 +0200 Subject: [PATCH] Fix out-of-class destructor definition --- src/libclang/function_parser.cpp | 9 ++++++--- test/cpp_member_function.cpp | 13 ++++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/libclang/function_parser.cpp b/src/libclang/function_parser.cpp index 80c1973..b8571af 100644 --- a/src/libclang/function_parser.cpp +++ b/src/libclang/function_parser.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "libclang_visitor.hpp" #include "parse_functions.hpp" @@ -657,13 +658,15 @@ std::unique_ptr detail::parse_cpp_destructor(const detail::parse_con detail::tokenizer tokenizer(context.tu, context.file, cur); detail::token_stream stream(tokenizer, cur); - auto is_virtual = detail::skip_if(stream, "virtual"); - detail::skip(stream, "~"); + auto prefix_info = parse_prefix_info(stream, "~", false); + DEBUG_ASSERT(!prefix_info.is_constexpr && !prefix_info.is_explicit, detail::assert_handler{}); + auto name = std::string("~") + stream.get().c_str(); cpp_destructor::builder builder(std::move(name)); context.comments.match(builder.get(), cur); detail::skip(stream, "("); detail::skip(stream, ")"); - return handle_suffix(context, cur, builder, stream, is_virtual, type_safe::nullopt); + return handle_suffix(context, cur, builder, stream, prefix_info.is_virtual, + std::move(prefix_info.semantic_parent)); } diff --git a/test/cpp_member_function.cpp b/test/cpp_member_function.cpp index 06c51a8..9ac583b 100644 --- a/test/cpp_member_function.cpp +++ b/test/cpp_member_function.cpp @@ -331,6 +331,10 @@ struct d : c /// virtual ~d() override final; ~d() final; }; + +/// virtual d::~d() override; +d::~d() {} + )"; auto file = parse({}, "cpp_destructor.cpp", code); @@ -364,12 +368,15 @@ struct d : c else if (dtor.name() == "~d") { REQUIRE(dtor.virtual_info()); - REQUIRE(dtor.virtual_info().value() - == (cpp_virtual_flags::override | cpp_virtual_flags::final)); + if (dtor.is_declaration()) + REQUIRE(dtor.virtual_info().value() + == (cpp_virtual_flags::override | cpp_virtual_flags::final)); + else + REQUIRE(dtor.virtual_info().value() == cpp_virtual_flags::override); REQUIRE(!dtor.noexcept_condition()); } else REQUIRE(false); }); - REQUIRE(count == 4u); + REQUIRE(count == 5u); }