Summary:
When we have a artificial constructor DIE, we currently create from that a global function with the name of that class.
That ends up causing a bunch of funny errors such as "must use 'struct' tag to refer to type 'Foo' in this scope" when
doing `Foo f`. Also causes that constructing a class via `Foo()` actually just calls that global function.
The fix is that when we have an artificial method decl, we always treat it as handled even if we don't create a CXXMethodDecl
for it (which we never do for artificial methods at the moment).
Fixes rdar://
55757491 and probably some other radars.
Reviewers: aprantl, vsk, shafik
Reviewed By: aprantl
Subscribers: jingham, shafik, labath, JDevlieghere, lldb-commits
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D68130
llvm-svn: 375151
# Test calling the base class.
self.expect("expr realbase.foo()", substrs=["1"])
+
+ # Test with locally constructed instances.
+ self.expect("expr Base().foo()", substrs=["1"])
+ self.expect("expr Derived().foo()", substrs=["2"])
int main() {
Base realbase;
+ realbase.foo();
Derived d;
Base *b = &d;
return 0; // Set breakpoint here
--- /dev/null
+from lldbsuite.test import lldbinline
+from lldbsuite.test import decorators
+
+lldbinline.MakeInlineTest(__file__, globals(), None)
--- /dev/null
+struct Foo {
+ // Triggers that we emit an artificial constructor for Foo.
+ virtual ~Foo() = default;
+};
+
+int main() {
+ Foo f;
+ // Try to construct foo in our expression.
+ return 0; //%self.expect("expr Foo()", substrs=["(Foo) $0 = {}"])
+}
is_attr_used, attrs.is_artificial);
type_handled = cxx_method_decl != NULL;
+ // Artificial methods are always handled even when don't
+ // create a new declaration for them.
+ type_handled |= attrs.is_artificial;
- if (type_handled) {
+ if (cxx_method_decl) {
LinkDeclContextToDIE(
ClangASTContext::GetAsDeclContext(cxx_method_decl),
die);