| """ | |
| Tests that C++ expression evaluation can | |
| disambiguate between rvalue and lvalue | |
| reference-qualified functions. | |
| """ | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| @skipIfWasm # no expression evaluation | |
| class TestFunctionRefQualifiers(TestBase): | |
| def test(self): | |
| self.build() | |
| lldbutil.run_to_source_breakpoint( | |
| self, "Break here", lldb.SBFileSpec("main.cpp") | |
| ) | |
| # const lvalue | |
| self.expect_expr("const_foo.func()", result_type="uint32_t", result_value="0") | |
| # const rvalue | |
| self.expect_expr( | |
| "static_cast<Foo const&&>(Foo{}).func()", | |
| result_type="int64_t", | |
| result_value="1", | |
| ) | |
| # non-const lvalue | |
| self.expect_expr("foo.func()", result_type="uint32_t", result_value="2") | |
| # non-const rvalue | |
| self.expect_expr("Foo{}.func()", result_type="int64_t", result_value="3") | |
| self.filecheck("target modules dump ast", __file__) | |
| # CHECK: |-CXXMethodDecl {{.*}} func 'uint32_t () const &' | |
| # CHECK-NEXT: | `-AsmLabelAttr {{.*}} | |
| # CHECK-NEXT: |-CXXMethodDecl {{.*}} func 'int64_t () const &&' | |
| # CHECK-NEXT: | `-AsmLabelAttr {{.*}} | |
| # CHECK-NEXT: |-CXXMethodDecl {{.*}} func 'uint32_t () &' | |
| # CHECK-NEXT: | `-AsmLabelAttr {{.*}} | |
| # CHECK-NEXT: `-CXXMethodDecl {{.*}} func 'int64_t () &&' | |
| # CHECK-NEXT: `-AsmLabelAttr {{.*}} |