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