| #include <cstdarg> | |
| #include <cstdlib> | |
| #include "ns.h" | |
| namespace { | |
| typedef unsigned int my_uint_t; | |
| int i; // Find the line number for anonymous namespace variable i. | |
| int myanonfunc (int a) | |
| { | |
| return a + a; | |
| } | |
| int | |
| variadic_sum (int arg_count...) | |
| { | |
| int sum = 0; | |
| std::va_list args; | |
| va_start(args, arg_count); | |
| for (int i = 0; i < arg_count; i++) | |
| sum += va_arg(args, int); | |
| va_end(args); | |
| return sum; | |
| } | |
| } | |
| namespace A { | |
| typedef unsigned int uint_t; | |
| namespace B { | |
| typedef unsigned int uint_t; | |
| int j; // Find the line number for named namespace variable j. | |
| int myfunc (int a); | |
| int myfunc2(int a) | |
| { | |
| return a + 2; | |
| } | |
| float myfunc (float f) | |
| { | |
| return f - 2.0; | |
| } | |
| } | |
| } | |
| namespace Y | |
| { | |
| typedef unsigned int uint_t; | |
| using A::B::j; | |
| int foo; | |
| } | |
| using A::B::j; // using declaration | |
| namespace Foo = A::B; // namespace alias | |
| using Foo::myfunc; // using declaration | |
| using namespace Foo; // using directive | |
| namespace A { | |
| namespace B { | |
| using namespace Y; | |
| int k; | |
| } | |
| } | |
| namespace ns1 { | |
| int value = 100; | |
| } | |
| namespace ns2 { | |
| int value = 200; | |
| } | |
| void test_namespace_scopes() { | |
| do { | |
| using namespace ns1; | |
| printf("ns1::value = %d\n", value); // Evaluate ns1::value | |
| } while(0); | |
| do { | |
| using namespace ns2; | |
| printf("ns2::value = %d\n", value); // Evaluate ns2::value | |
| } while(0); | |
| } | |
| int Foo::myfunc(int a) | |
| { | |
| test_namespace_scopes(); | |
| ::my_uint_t anon_uint = 0; | |
| A::uint_t a_uint = 1; | |
| B::uint_t b_uint = 2; | |
| Y::uint_t y_uint = 3; | |
| i = 3; | |
| j = 4; | |
| printf("::i=%d\n", ::i); | |
| printf("A::B::j=%d\n", A::B::j); | |
| printf("variadic_sum=%d\n", variadic_sum(3, 1, 2, 3)); | |
| myanonfunc(3); | |
| return myfunc2(3) + j + i + a + 2 + anon_uint + a_uint + b_uint + y_uint; // Set break point at this line. | |
| } | |
| namespace B { | |
| struct Bar { | |
| int x() { return 42; } | |
| }; | |
| Bar bar; | |
| } // namespace B | |
| namespace A::B { | |
| struct Bar { | |
| int y() { return 137; } | |
| }; | |
| } // namespace A::B | |
| namespace NS1::NS2 { | |
| struct Foo { | |
| int bar() { return -2; } | |
| }; | |
| } // namespace NS1::NS2 | |
| namespace NS2 { | |
| struct Foo { | |
| int bar() { return -3; } | |
| }; | |
| } // namespace NS2 | |
| namespace { | |
| namespace InAnon1 { | |
| int var_in_anon = 10; | |
| namespace { | |
| inline namespace inline_ns { | |
| int var_in_anon = 15; | |
| namespace InAnon2 { | |
| namespace { | |
| int var_in_anon = 5; | |
| } // namespace | |
| } // namespace InAnon2 | |
| } // namespace inline_ns | |
| } // namespace | |
| } // namespace InAnon1 | |
| } // namespace | |
| int | |
| main (int argc, char const *argv[]) | |
| { | |
| test_lookup_at_global_scope(); | |
| test_lookup_at_file_scope(); | |
| A::test_lookup_at_ns_scope(); | |
| A::B::test_lookup_at_nested_ns_scope(); | |
| A::B::test_lookup_at_nested_ns_scope_after_using(); | |
| test_lookup_before_using_directive(); | |
| test_lookup_after_using_directive(); | |
| ::B::Bar bb; | |
| A::B::Bar ab; | |
| return Foo::myfunc(12) + bb.x() + ab.y() + NS1::NS2::Foo{}.bar() + | |
| NS2::Foo{}.bar() + InAnon1::var_in_anon + | |
| InAnon1::InAnon2::var_in_anon + InAnon1::inline_ns::var_in_anon; | |
| } |