1670cac72SJim Ingham""" 2670cac72SJim InghamTests that C++ expression evaluation can 3670cac72SJim Inghamdisambiguate between rvalue and lvalue 4670cac72SJim Inghamreference-qualified functions. 5670cac72SJim Ingham""" 6670cac72SJim Ingham 7670cac72SJim Inghamimport lldb 8670cac72SJim Inghamfrom lldbsuite.test.decorators import * 9670cac72SJim Inghamfrom lldbsuite.test.lldbtest import * 10670cac72SJim Inghamfrom lldbsuite.test import lldbutil 11670cac72SJim Ingham 12670cac72SJim Ingham 13*2238dcc3SJonas Devlieghereclass TestFunctionRefQualifiers(TestBase): 14670cac72SJim Ingham def test(self): 15670cac72SJim Ingham self.build() 16*2238dcc3SJonas Devlieghere lldbutil.run_to_source_breakpoint( 17*2238dcc3SJonas Devlieghere self, "Break here", lldb.SBFileSpec("main.cpp") 18*2238dcc3SJonas Devlieghere ) 19670cac72SJim Ingham 20670cac72SJim Ingham # const lvalue 21670cac72SJim Ingham self.expect_expr("const_foo.func()", result_type="uint32_t", result_value="0") 22670cac72SJim Ingham 23670cac72SJim Ingham # const rvalue 24*2238dcc3SJonas Devlieghere self.expect_expr( 25*2238dcc3SJonas Devlieghere "static_cast<Foo const&&>(Foo{}).func()", 26*2238dcc3SJonas Devlieghere result_type="int64_t", 27*2238dcc3SJonas Devlieghere result_value="1", 28*2238dcc3SJonas Devlieghere ) 29670cac72SJim Ingham 30670cac72SJim Ingham # non-const lvalue 31670cac72SJim Ingham self.expect_expr("foo.func()", result_type="uint32_t", result_value="2") 32670cac72SJim Ingham 33670cac72SJim Ingham # non-const rvalue 34670cac72SJim Ingham self.expect_expr("Foo{}.func()", result_type="int64_t", result_value="3") 35670cac72SJim Ingham 36670cac72SJim Ingham self.filecheck("target modules dump ast", __file__) 37670cac72SJim Ingham # CHECK: |-CXXMethodDecl {{.*}} func 'uint32_t () const &' 38670cac72SJim Ingham # CHECK-NEXT: | `-AsmLabelAttr {{.*}} 39670cac72SJim Ingham # CHECK-NEXT: |-CXXMethodDecl {{.*}} func 'int64_t () const &&' 40670cac72SJim Ingham # CHECK-NEXT: | `-AsmLabelAttr {{.*}} 41670cac72SJim Ingham # CHECK-NEXT: |-CXXMethodDecl {{.*}} func 'uint32_t () &' 42670cac72SJim Ingham # CHECK-NEXT: | `-AsmLabelAttr {{.*}} 43670cac72SJim Ingham # CHECK-NEXT: `-CXXMethodDecl {{.*}} func 'int64_t () &&' 44670cac72SJim Ingham # CHECK-NEXT: `-AsmLabelAttr {{.*}} 45