Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.h @@ -0,0 +1,3 @@ +class ExtBase { + virtual char bar(); +}; Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/ExtBase.cpp @@ -0,0 +1,5 @@ +#include "ExtBase.h" + +char ExtBase::bar() { + return 'x'; +} Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/Makefile @@ -0,0 +1,3 @@ +LEVEL = ../../../make +CXX_SOURCES := main.cpp ExtBase.cpp +include $(LEVEL)/Makefile.rules Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/TestDynamicCast.py @@ -0,0 +1,3 @@ +from lldbsuite.test import lldbinline + +lldbinline.MakeInlineTest(__file__, globals(), []) Index: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/dynamic_cast/main.cpp @@ -0,0 +1,51 @@ +#include "ExtBase.h" + +class Base { +public: + virtual char foo() { + return 'b'; + } +}; + +class Derived : public Base { +public: + char foo() override { + return 'd'; + } +}; + +class NonOverrideDerived : public Base { +}; + +class ExtDerived : public ExtBase { +public: + char bar() override { + return 'y'; + } +}; + +int main() { + Derived d; + NonOverrideDerived d2; + Base *b = &d; + Base *real_base = new Base(); + char c = dynamic_cast(b)->foo(); + + ExtDerived ext_d; + ExtBase *ext_b = &ext_d; + ExtBase *ext_real_base = new ExtBase(); + c = dynamic_cast(ext_b)->bar(); + + + return 0; //% self.expect("expression dynamic_cast(b) == (Derived*)b", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(b) == (Base*)b", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(real_base) == nullptr", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(&d) == nullptr", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(real_base) == nullptr", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(&d2) == nullptr", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(&d2) == (NonOverrideDerived *)&d2", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(&ext_d) == nullptr", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(ext_b) == (class ExtDerived*)ext_b", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(ext_real_base) == (class ExtBase*)ext_real_base", substrs = ["bool", " = true"]) + //% self.expect("expression dynamic_cast(ext_real_base) == nullptr", substrs = ["bool", " = true"]) +} Index: lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp =================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp @@ -1265,16 +1265,10 @@ clang::NamedDecl *named_decl = DeclForGlobal(global_variable); if (!named_decl) { - if (IsObjCSelectorRef(llvm_value_ptr)) - return true; - - if (!global_variable->hasExternalLinkage()) - return true; - LLDB_LOG(log, "Found global variable \"{0}\" without metadata", global_variable->getName()); - return false; + return true; } llvm::StringRef name(named_decl->getName());