xref: /llvm-project/lldb/test/API/lang/cpp/namespace/main.cpp (revision 65c807e69545ec23c1a258f66f744874531c7d26)
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