199451b44SJordan Rupprecht #include <cstdarg>
299451b44SJordan Rupprecht #include <cstdlib>
399451b44SJordan Rupprecht #include "ns.h"
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht namespace {
699451b44SJordan Rupprecht typedef unsigned int my_uint_t;
799451b44SJordan Rupprecht int i; // Find the line number for anonymous namespace variable i.
899451b44SJordan Rupprecht
myanonfunc(int a)999451b44SJordan Rupprecht int myanonfunc (int a)
1099451b44SJordan Rupprecht {
1199451b44SJordan Rupprecht return a + a;
1299451b44SJordan Rupprecht }
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht int
variadic_sum(int arg_count...)1599451b44SJordan Rupprecht variadic_sum (int arg_count...)
1699451b44SJordan Rupprecht {
1799451b44SJordan Rupprecht int sum = 0;
1899451b44SJordan Rupprecht std::va_list args;
1999451b44SJordan Rupprecht va_start(args, arg_count);
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht for (int i = 0; i < arg_count; i++)
2299451b44SJordan Rupprecht sum += va_arg(args, int);
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht va_end(args);
2599451b44SJordan Rupprecht return sum;
2699451b44SJordan Rupprecht }
2799451b44SJordan Rupprecht }
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht namespace A {
3099451b44SJordan Rupprecht typedef unsigned int uint_t;
3199451b44SJordan Rupprecht namespace B {
3299451b44SJordan Rupprecht typedef unsigned int uint_t;
3399451b44SJordan Rupprecht int j; // Find the line number for named namespace variable j.
3499451b44SJordan Rupprecht int myfunc (int a);
myfunc2(int a)3599451b44SJordan Rupprecht int myfunc2(int a)
3699451b44SJordan Rupprecht {
3799451b44SJordan Rupprecht return a + 2;
3899451b44SJordan Rupprecht }
myfunc(float f)3999451b44SJordan Rupprecht float myfunc (float f)
4099451b44SJordan Rupprecht {
4199451b44SJordan Rupprecht return f - 2.0;
4299451b44SJordan Rupprecht }
4399451b44SJordan Rupprecht }
4499451b44SJordan Rupprecht }
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht namespace Y
4799451b44SJordan Rupprecht {
4899451b44SJordan Rupprecht typedef unsigned int uint_t;
4999451b44SJordan Rupprecht using A::B::j;
5099451b44SJordan Rupprecht int foo;
5199451b44SJordan Rupprecht }
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht using A::B::j; // using declaration
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht namespace Foo = A::B; // namespace alias
5699451b44SJordan Rupprecht
5799451b44SJordan Rupprecht using Foo::myfunc; // using declaration
5899451b44SJordan Rupprecht
5999451b44SJordan Rupprecht using namespace Foo; // using directive
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht namespace A {
6299451b44SJordan Rupprecht namespace B {
6399451b44SJordan Rupprecht using namespace Y;
6499451b44SJordan Rupprecht int k;
6599451b44SJordan Rupprecht }
6699451b44SJordan Rupprecht }
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht namespace ns1 {
6999451b44SJordan Rupprecht int value = 100;
7099451b44SJordan Rupprecht }
7199451b44SJordan Rupprecht
7299451b44SJordan Rupprecht namespace ns2 {
7399451b44SJordan Rupprecht int value = 200;
7499451b44SJordan Rupprecht }
7599451b44SJordan Rupprecht
test_namespace_scopes()7699451b44SJordan Rupprecht void test_namespace_scopes() {
7799451b44SJordan Rupprecht do {
7899451b44SJordan Rupprecht using namespace ns1;
7999451b44SJordan Rupprecht printf("ns1::value = %d\n", value); // Evaluate ns1::value
8099451b44SJordan Rupprecht } while(0);
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht do {
8399451b44SJordan Rupprecht using namespace ns2;
8499451b44SJordan Rupprecht printf("ns2::value = %d\n", value); // Evaluate ns2::value
8599451b44SJordan Rupprecht } while(0);
8699451b44SJordan Rupprecht }
8799451b44SJordan Rupprecht
myfunc(int a)8899451b44SJordan Rupprecht int Foo::myfunc(int a)
8999451b44SJordan Rupprecht {
9099451b44SJordan Rupprecht test_namespace_scopes();
9199451b44SJordan Rupprecht
9299451b44SJordan Rupprecht ::my_uint_t anon_uint = 0;
9399451b44SJordan Rupprecht A::uint_t a_uint = 1;
9499451b44SJordan Rupprecht B::uint_t b_uint = 2;
9599451b44SJordan Rupprecht Y::uint_t y_uint = 3;
9699451b44SJordan Rupprecht i = 3;
9799451b44SJordan Rupprecht j = 4;
9899451b44SJordan Rupprecht printf("::i=%d\n", ::i);
9999451b44SJordan Rupprecht printf("A::B::j=%d\n", A::B::j);
10099451b44SJordan Rupprecht printf("variadic_sum=%d\n", variadic_sum(3, 1, 2, 3));
10199451b44SJordan Rupprecht myanonfunc(3);
10299451b44SJordan Rupprecht return myfunc2(3) + j + i + a + 2 + anon_uint + a_uint + b_uint + y_uint; // Set break point at this line.
10399451b44SJordan Rupprecht }
10499451b44SJordan Rupprecht
1056cdfa295SMichael Buch namespace B {
1066cdfa295SMichael Buch struct Bar {
xB::Bar1076cdfa295SMichael Buch int x() { return 42; }
1086cdfa295SMichael Buch };
1096cdfa295SMichael Buch Bar bar;
1106cdfa295SMichael Buch } // namespace B
1116cdfa295SMichael Buch
1126cdfa295SMichael Buch namespace A::B {
1136cdfa295SMichael Buch struct Bar {
yA::B::Bar1146cdfa295SMichael Buch int y() { return 137; }
1156cdfa295SMichael Buch };
1166cdfa295SMichael Buch } // namespace A::B
1176cdfa295SMichael Buch
1186cdfa295SMichael Buch namespace NS1::NS2 {
1196cdfa295SMichael Buch struct Foo {
barNS1::NS2::Foo1206cdfa295SMichael Buch int bar() { return -2; }
1216cdfa295SMichael Buch };
1226cdfa295SMichael Buch } // namespace NS1::NS2
1236cdfa295SMichael Buch
1246cdfa295SMichael Buch namespace NS2 {
1256cdfa295SMichael Buch struct Foo {
barNS2::Foo1266cdfa295SMichael Buch int bar() { return -3; }
1276cdfa295SMichael Buch };
1286cdfa295SMichael Buch } // namespace NS2
1296cdfa295SMichael Buch
130*65c807e6SMichael Buch namespace {
131*65c807e6SMichael Buch namespace InAnon1 {
132*65c807e6SMichael Buch int var_in_anon = 10;
133*65c807e6SMichael Buch namespace {
134*65c807e6SMichael Buch inline namespace inline_ns {
135*65c807e6SMichael Buch int var_in_anon = 15;
136*65c807e6SMichael Buch namespace InAnon2 {
137*65c807e6SMichael Buch namespace {
138*65c807e6SMichael Buch int var_in_anon = 5;
139*65c807e6SMichael Buch } // namespace
140*65c807e6SMichael Buch } // namespace InAnon2
141*65c807e6SMichael Buch } // namespace inline_ns
142*65c807e6SMichael Buch } // namespace
143*65c807e6SMichael Buch } // namespace InAnon1
144*65c807e6SMichael Buch } // namespace
145*65c807e6SMichael Buch
14699451b44SJordan Rupprecht int
main(int argc,char const * argv[])14799451b44SJordan Rupprecht main (int argc, char const *argv[])
14899451b44SJordan Rupprecht {
14999451b44SJordan Rupprecht test_lookup_at_global_scope();
15099451b44SJordan Rupprecht test_lookup_at_file_scope();
15199451b44SJordan Rupprecht A::test_lookup_at_ns_scope();
15299451b44SJordan Rupprecht A::B::test_lookup_at_nested_ns_scope();
15399451b44SJordan Rupprecht A::B::test_lookup_at_nested_ns_scope_after_using();
15499451b44SJordan Rupprecht test_lookup_before_using_directive();
15599451b44SJordan Rupprecht test_lookup_after_using_directive();
1566cdfa295SMichael Buch ::B::Bar bb;
1576cdfa295SMichael Buch A::B::Bar ab;
1586cdfa295SMichael Buch return Foo::myfunc(12) + bb.x() + ab.y() + NS1::NS2::Foo{}.bar() +
159*65c807e6SMichael Buch NS2::Foo{}.bar() + InAnon1::var_in_anon +
160*65c807e6SMichael Buch InAnon1::InAnon2::var_in_anon + InAnon1::inline_ns::var_in_anon;
16199451b44SJordan Rupprecht }
162