import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


@skipIfTargetDoesNotSupportSharedLibraries()
class OdrHandlingWithDylibTestCase(TestBase):
    @skipIf(
        bugnumber="https://github.com/llvm/llvm-project/issues/50375, rdar://135551810"
    )
    def test(self):
        """
        Tests that the expression evaluator is able to deal with types
        whose definitions conflict across multiple LLDB modules (in this
        case the definition for 'class Service' in the main executable
        has an additional field compared to the definition found in the
        dylib). This causes the ASTImporter to detect a name conflict
        while importing 'Service'. With LLDB's liberal ODRHandlingType
        the ASTImporter happily creates a conflicting AST node for
        'Service' in the scratch ASTContext, leading to a crash down
        the line.
        """
        self.build()

        lldbutil.run_to_source_breakpoint(
            self, "plugin_entry", lldb.SBFileSpec("plugin.cpp")
        )

        self.expect_expr("*gProxyThis")
