/* This testcase is part of GDB, the GNU debugger. Copyright 2017-2024 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Code for the all-param-prefixes test. */ void param_prefixes_test_long (long) {} void param_prefixes_test_intp_intr (int *, int&) {} /* Code for the overload test. */ void overload_ambiguous_test (long) {} void overload_ambiguous_test (int, int) {} void overload_ambiguous_test (int, long) {} /* Code for the overload-2 test. */ /* Generate functions/methods all with the same name, in different scopes, but all with different parameters. */ struct overload2_arg1 {}; struct overload2_arg2 {}; struct overload2_arg3 {}; struct overload2_arg4 {}; struct overload2_arg5 {}; struct overload2_arg6 {}; struct overload2_arg7 {}; struct overload2_arg8 {}; struct overload2_arg9 {}; struct overload2_arga {}; #define GEN_OVERLOAD2_FUNCTIONS(ARG1, ARG2) \ void __attribute__ ((used)) \ overload2_function (ARG1) \ {} \ \ struct struct_overload2_test \ { \ void __attribute__ ((used)) \ overload2_function (ARG2); \ }; \ \ void __attribute__ ((used)) \ struct_overload2_test::overload2_function (ARG2) \ {} /* In the global namespace. */ GEN_OVERLOAD2_FUNCTIONS( overload2_arg1, overload2_arg2) namespace { /* In an anonymous namespace. */ GEN_OVERLOAD2_FUNCTIONS (overload2_arg3, overload2_arg4) } namespace ns_overload2_test { /* In a namespace. */ GEN_OVERLOAD2_FUNCTIONS (overload2_arg5, overload2_arg6) namespace { /* In a nested anonymous namespace. */ GEN_OVERLOAD2_FUNCTIONS (overload2_arg7, overload2_arg8) namespace ns_overload2_test { /* In a nested namespace. */ GEN_OVERLOAD2_FUNCTIONS (overload2_arg9, overload2_arga) } } } /* Code for the overload-3 test. */ #define GEN_OVERLOAD3_FUNCTIONS(ARG1, ARG2) \ void __attribute__ ((used)) \ overload3_function (ARG1) \ {} \ void __attribute__ ((used)) \ overload3_function (ARG2) \ {} \ \ struct struct_overload3_test \ { \ void __attribute__ ((used)) \ overload3_function (ARG1); \ void __attribute__ ((used)) \ overload3_function (ARG2); \ }; \ \ void __attribute__ ((used)) \ struct_overload3_test::overload3_function (ARG1) \ {} \ void __attribute__ ((used)) \ struct_overload3_test::overload3_function (ARG2) \ {} /* In the global namespace. */ GEN_OVERLOAD3_FUNCTIONS (int, long) namespace { /* In an anonymous namespace. */ GEN_OVERLOAD3_FUNCTIONS (int, long) } namespace ns_overload3_test { /* In a namespace. */ GEN_OVERLOAD3_FUNCTIONS (int, long) namespace { /* In a nested anonymous namespace. */ GEN_OVERLOAD3_FUNCTIONS (int, long) namespace ns_overload3_test { /* In a nested namespace. */ GEN_OVERLOAD3_FUNCTIONS (int, long) } } } /* Code for the template-function_foo (template parameter completion) tests. */ template struct template_struct { T template_overload_fn (T); }; template T template_struct::template_overload_fn (T t) { return t; } template_struct template_struct_int; template_struct template_struct_long; /* Code for the template-parameter-overload test. */ template void foo (T c) {} template void foo (T1 a, T2 b) {} template struct a { void method () {} }; template struct b { void method () {} }; template struct c { void method () {} }; template struct d { void method () {}; }; template struct A { void method () {} }; template struct B { void method () {} }; namespace n { struct na {}; struct nb {}; template struct NA {}; template struct NB {}; }; static void template_function_foo () { a> aa; aa.method (); a> ab; ab.method (); c> cc; cc.method (); c> cd; cd.method (); foo (aa); foo (ab); foo (cc); foo (cd); foo (aa, ab); foo (aa, cc); foo (aa, cd); A>, c>> Aabcd; Aabcd.method (); foo (Aabcd); A>, a>> Aabaa; Aabaa.method (); foo (Aabaa); A>, a>> Aabab; Aabab.method (); foo (Aabab); B>, c>> Babcd; Babcd.method (); foo (Babcd); foo (Aabcd, Babcd); foo (Aabcd, Aabaa); foo (Aabcd, Aabab); n::na na; n::nb nb; foo (na, nb); a ana; b bnb; foo (ana, bnb); n::NA NAnanb; n::NB Nbnanb; foo (NAnanb, Nbnanb); } /* Code for the template2-ret-type tests. */ template struct template2_ret_type {}; template struct template2_struct { template T template2_fn (T = T (), T2 t2 = T2 (), T3 t3 = T3 ()); }; template template T template2_struct::template2_fn (T t, T2 t2, T3 t3) { return T (); } template2_struct > template2_struct_inst; /* Code for the const-overload tests. */ struct struct_with_const_overload { void const_overload_fn (); void const_overload_fn () const; }; void struct_with_const_overload::const_overload_fn () {} void struct_with_const_overload::const_overload_fn () const {} void not_overloaded_fn () {} /* Code for the incomplete-scope-colon tests. */ struct struct_incomplete_scope_colon_test { void incomplete_scope_colon_test (); }; void struct_incomplete_scope_colon_test::incomplete_scope_colon_test () {} namespace ns_incomplete_scope_colon_test { void incomplete_scope_colon_test () {} } namespace ns2_incomplete_scope_colon_test { struct struct_in_ns2_incomplete_scope_colon_test { void incomplete_scope_colon_test (); }; void struct_in_ns2_incomplete_scope_colon_test::incomplete_scope_colon_test () {} } /* Code for the anon-ns tests. */ namespace { void __attribute__ ((used)) anon_ns_function () {} struct anon_ns_struct { void __attribute__ ((used)) anon_ns_function (); }; void __attribute__ ((used)) anon_ns_struct::anon_ns_function () {} } namespace the_anon_ns_wrapper_ns { namespace { void __attribute__ ((used)) anon_ns_function () {} struct anon_ns_struct { void __attribute__ ((used)) anon_ns_function (); }; void __attribute__ ((used)) anon_ns_struct::anon_ns_function () {} } } /* the_anon_ns_wrapper_ns */ /* Code for the global-ns-scope-op tests. */ void global_ns_scope_op_function () { } /* Add a function with the same name to a namespace. We want to test that "b ::global_ns_function" does NOT select it. */ namespace the_global_ns_scope_op_ns { void global_ns_scope_op_function () { } } /* Code for the ambiguous-prefix tests. */ /* Create a few functions/methods with the same "ambiguous_prefix_" prefix. They in different scopes, but "b ambiguous_prefix_" should list them all, and figure out the LCD is ambiguous_prefix_. */ void ambiguous_prefix_global_func () { } namespace the_ambiguous_prefix_ns { void ambiguous_prefix_ns_func () { } } struct the_ambiguous_prefix_struct { void ambiguous_prefix_method (); }; void the_ambiguous_prefix_struct::ambiguous_prefix_method () { } /* Code for the function-labels test. */ int function_with_labels (int i) { if (i > 0) { label1: return i + 20; } else { label2: return i + 10; } } /* Code for the no-data-symbols and if-expression tests. */ int code_data = 0; int another_data = 0; /* A function that has a same "code" prefix as the global above. We want to ensure that completing on "b code" doesn't offer the data symbol. */ void code_function () { } /* Code for the operator< tests. */ enum foo_enum { foo_value }; bool operator<(foo_enum lhs, foo_enum rhs) { label1: return false; } /* Code for the in-source-file-unconstrained / in-source-file-ambiguous tests. */ int file_constrained_test_cpls_function (int i) { if (i > 0) { label1: return i + 20; } else { label2: return i + 10; } } int main () { template2_struct_inst.template2_fn (); template_struct_int.template_overload_fn(0); template_struct_long.template_overload_fn(0); template_function_foo (); return 0; }