17d297de9SAndy Yankovsky""" 27d297de9SAndy YankovskyTests const static data members as specified by C++11 [class.static.data]p3. 37d297de9SAndy Yankovsky""" 47d297de9SAndy Yankovsky 57d297de9SAndy Yankovskyimport lldb 67d297de9SAndy Yankovskyfrom lldbsuite.test.decorators import * 77d297de9SAndy Yankovskyfrom lldbsuite.test.lldbtest import * 87d297de9SAndy Yankovskyfrom lldbsuite.test import lldbutil 97d297de9SAndy Yankovsky 107d297de9SAndy Yankovskyclass TestCase(TestBase): 117d297de9SAndy Yankovsky 127d297de9SAndy Yankovsky def test(self): 137d297de9SAndy Yankovsky self.build() 147d297de9SAndy Yankovsky lldbutil.run_to_source_breakpoint(self, "// break here", 157d297de9SAndy Yankovsky lldb.SBFileSpec("main.cpp")) 167d297de9SAndy Yankovsky 177d297de9SAndy Yankovsky # Test using a simple const static integer member. 187d297de9SAndy Yankovsky self.expect_expr("A::int_val", result_value="1") 197d297de9SAndy Yankovsky 207d297de9SAndy Yankovsky # Try accessing the int member via some expressions that still produce 217d297de9SAndy Yankovsky # an lvalue. 227d297de9SAndy Yankovsky self.expect_expr("a.int_val", result_value="1") 237d297de9SAndy Yankovsky self.expect_expr("(A::int_val)", result_value="1") 247d297de9SAndy Yankovsky self.expect_expr("+A::int_val", result_value="1") 257d297de9SAndy Yankovsky self.expect_expr("1,A::int_val", result_value="1") 267d297de9SAndy Yankovsky self.expect_expr("true ? A::int_val : A::int_val", result_value="1") 277d297de9SAndy Yankovsky 287d297de9SAndy Yankovsky # Test a simple integer member that was also defined in a namespace 297d297de9SAndy Yankovsky # scope and has an address. 307d297de9SAndy Yankovsky self.expect_expr("A::int_val_with_address", result_value="2") 317d297de9SAndy Yankovsky 327d297de9SAndy Yankovsky # Test a bool member. 337d297de9SAndy Yankovsky self.expect_expr("A::bool_val", result_value="true") 347d297de9SAndy Yankovsky 357d297de9SAndy Yankovsky # Test that minimum and maximum values for each data type are right. 367d297de9SAndy Yankovsky self.expect_expr("A::char_max == char_max", result_value="true") 377d297de9SAndy Yankovsky self.expect_expr("A::uchar_max == uchar_max", result_value="true") 387d297de9SAndy Yankovsky self.expect_expr("A::int_max == int_max", result_value="true") 397d297de9SAndy Yankovsky self.expect_expr("A::uint_max == uint_max", result_value="true") 407d297de9SAndy Yankovsky self.expect_expr("A::long_max == long_max", result_value="true") 417d297de9SAndy Yankovsky self.expect_expr("A::ulong_max == ulong_max", result_value="true") 427d297de9SAndy Yankovsky self.expect_expr("A::longlong_max == longlong_max", result_value="true") 437d297de9SAndy Yankovsky self.expect_expr("A::ulonglong_max == ulonglong_max", result_value="true") 447d297de9SAndy Yankovsky 457d297de9SAndy Yankovsky self.expect_expr("A::char_min == char_min", result_value="true") 467d297de9SAndy Yankovsky self.expect_expr("A::uchar_min == uchar_min", result_value="true") 477d297de9SAndy Yankovsky self.expect_expr("A::int_min == int_min", result_value="true") 487d297de9SAndy Yankovsky self.expect_expr("A::uint_min == uint_min", result_value="true") 497d297de9SAndy Yankovsky self.expect_expr("A::long_min == long_min", result_value="true") 507d297de9SAndy Yankovsky self.expect_expr("A::ulong_min == ulong_min", result_value="true") 517d297de9SAndy Yankovsky self.expect_expr("A::longlong_min == longlong_min", result_value="true") 527d297de9SAndy Yankovsky self.expect_expr("A::ulonglong_min == ulonglong_min", result_value="true") 537d297de9SAndy Yankovsky 547d297de9SAndy Yankovsky # Test an unscoped enum. 557d297de9SAndy Yankovsky self.expect_expr("A::enum_val", result_value="enum_case2") 567d297de9SAndy Yankovsky # Test an unscoped enum with an invalid enum case. 577d297de9SAndy Yankovsky self.expect_expr("A::invalid_enum_val", result_value="enum_case1 | enum_case2 | 0x4") 587d297de9SAndy Yankovsky 597d297de9SAndy Yankovsky # Test a scoped enum. 607d297de9SAndy Yankovsky self.expect_expr("A::scoped_enum_val", result_value="scoped_enum_case2") 617d297de9SAndy Yankovsky # Test an scoped enum with an invalid enum case. 627d297de9SAndy Yankovsky self.expect_expr("A::invalid_scoped_enum_val", result_value="scoped_enum_case1 | 0x4") 637d297de9SAndy Yankovsky 647d297de9SAndy Yankovsky # Test an enum with fixed underlying type. 657d297de9SAndy Yankovsky self.expect_expr("A::scoped_char_enum_val", result_value="case2") 667d297de9SAndy Yankovsky self.expect_expr("A::scoped_ll_enum_val_neg", result_value="case0") 677d297de9SAndy Yankovsky self.expect_expr("A::scoped_ll_enum_val", result_value="case2") 687d297de9SAndy Yankovsky 69*140bcd36SMichael Buch # Test an aliased enum with fixed underlying type. 70*140bcd36SMichael Buch self.expect_expr("ClassWithEnumAlias::enum_alias", 71*140bcd36SMichael Buch result_value="scoped_enum_case2") 72*140bcd36SMichael Buch self.expect_expr("ClassWithEnumAlias::enum_alias_alias", 73*140bcd36SMichael Buch result_value="scoped_enum_case1") 74*140bcd36SMichael Buch 757d297de9SAndy Yankovsky # Test taking address. 767d297de9SAndy Yankovsky if lldbplatformutil.getPlatform() == "windows": 777d297de9SAndy Yankovsky # On Windows data members without the out-of-class definitions still have 787d297de9SAndy Yankovsky # valid adresses and the following expression works fine. 797d297de9SAndy Yankovsky self.expect_expr("const int *i = &A::int_val; *i", result_value="1") 807d297de9SAndy Yankovsky else: 817d297de9SAndy Yankovsky # On other platforms (Linux, macos) data members without the out-of-class 827d297de9SAndy Yankovsky # definitions don't have valid addresses and the following code produces 837d297de9SAndy Yankovsky # a linker error. 847d297de9SAndy Yankovsky self.expect("expr const int *i = &A::int_val; *i", error=True, 857d297de9SAndy Yankovsky substrs=["Couldn't lookup symbols:"]) 867d297de9SAndy Yankovsky 877d297de9SAndy Yankovsky # This should work on all platforms. 887d297de9SAndy Yankovsky self.expect_expr("const int *i = &A::int_val_with_address; *i", 897d297de9SAndy Yankovsky result_value="2") 907d297de9SAndy Yankovsky 917d297de9SAndy Yankovsky # dsymutil strips the debug info for classes that only have const static 927d297de9SAndy Yankovsky # data members without a definition namespace scope. 937d297de9SAndy Yankovsky @expectedFailureAll(debug_info=["dsym"]) 947d297de9SAndy Yankovsky def test_class_with_only_const_static(self): 957d297de9SAndy Yankovsky self.build() 967d297de9SAndy Yankovsky lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.cpp")) 977d297de9SAndy Yankovsky 987d297de9SAndy Yankovsky self.expect_expr("ClassWithOnlyConstStatic::member", result_value="3") 997d297de9SAndy Yankovsky 1007d297de9SAndy Yankovsky # Test `constexpr static`. 1017d297de9SAndy Yankovsky self.expect_expr("ClassWithConstexprs::member", result_value="2") 1027d297de9SAndy Yankovsky self.expect_expr("ClassWithConstexprs::enum_val", result_value="enum_case2") 1037d297de9SAndy Yankovsky self.expect_expr("ClassWithConstexprs::scoped_enum_val", result_value="scoped_enum_case2") 104