162 lines · cpp
1#include <cstdarg>2#include <cstdlib>3#include "ns.h"4 5namespace {6 typedef unsigned int my_uint_t;7 int i; // Find the line number for anonymous namespace variable i.8 9 int myanonfunc (int a)10 {11 return a + a;12 }13 14 int15 variadic_sum (int arg_count...)16 {17 int sum = 0;18 std::va_list args;19 va_start(args, arg_count);20 21 for (int i = 0; i < arg_count; i++)22 sum += va_arg(args, int);23 24 va_end(args);25 return sum;26 }27}28 29namespace A {30 typedef unsigned int uint_t;31 namespace B {32 typedef unsigned int uint_t;33 int j; // Find the line number for named namespace variable j.34 int myfunc (int a);35 int myfunc2(int a)36 {37 return a + 2;38 }39 float myfunc (float f)40 {41 return f - 2.0;42 }43 }44}45 46namespace Y47{48 typedef unsigned int uint_t;49 using A::B::j;50 int foo;51}52 53using A::B::j; // using declaration54 55namespace Foo = A::B; // namespace alias56 57using Foo::myfunc; // using declaration58 59using namespace Foo; // using directive60 61namespace A {62 namespace B {63 using namespace Y;64 int k;65 }66}67 68namespace ns1 {69 int value = 100;70}71 72namespace ns2 {73 int value = 200;74}75 76void test_namespace_scopes() {77 do {78 using namespace ns1;79 printf("ns1::value = %d\n", value); // Evaluate ns1::value80 } while(0);81 82 do {83 using namespace ns2;84 printf("ns2::value = %d\n", value); // Evaluate ns2::value85 } while(0);86}87 88int Foo::myfunc(int a)89{90 test_namespace_scopes(); 91 92 ::my_uint_t anon_uint = 0;93 A::uint_t a_uint = 1;94 B::uint_t b_uint = 2;95 Y::uint_t y_uint = 3;96 i = 3;97 j = 4;98 printf("::i=%d\n", ::i);99 printf("A::B::j=%d\n", A::B::j);100 printf("variadic_sum=%d\n", variadic_sum(3, 1, 2, 3));101 myanonfunc(3);102 return myfunc2(3) + j + i + a + 2 + anon_uint + a_uint + b_uint + y_uint; // Set break point at this line.103}104 105namespace B {106struct Bar {107 int x() { return 42; }108};109Bar bar;110} // namespace B111 112namespace A::B {113struct Bar {114 int y() { return 137; }115};116} // namespace A::B117 118namespace NS1::NS2 {119struct Foo {120 int bar() { return -2; }121};122} // namespace NS1::NS2123 124namespace NS2 {125struct Foo {126 int bar() { return -3; }127};128} // namespace NS2129 130namespace {131namespace InAnon1 {132int var_in_anon = 10;133namespace {134inline namespace inline_ns {135int var_in_anon = 15;136namespace InAnon2 {137namespace {138int var_in_anon = 5;139} // namespace140} // namespace InAnon2141} // namespace inline_ns142} // namespace143} // namespace InAnon1144} // namespace145 146int147main (int argc, char const *argv[])148{149 test_lookup_at_global_scope();150 test_lookup_at_file_scope();151 A::test_lookup_at_ns_scope();152 A::B::test_lookup_at_nested_ns_scope();153 A::B::test_lookup_at_nested_ns_scope_after_using();154 test_lookup_before_using_directive();155 test_lookup_after_using_directive();156 ::B::Bar bb;157 A::B::Bar ab;158 return Foo::myfunc(12) + bb.x() + ab.y() + NS1::NS2::Foo{}.bar() +159 NS2::Foo{}.bar() + InAnon1::var_in_anon +160 InAnon1::InAnon2::var_in_anon + InAnon1::inline_ns::var_in_anon;161}162