1/* Self tests for lookup_name_info for GDB, the GNU debugger. 2 3 Copyright (C) 2017-2020 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20#include "defs.h" 21#include "gdbsupport/selftest.h" 22#include "symtab.h" 23 24namespace selftests { 25namespace lookup_name { 26 27/* Check that removing parameter info out of NAME produces EXPECTED. 28 COMPLETION_MODE indicates whether we're testing normal and 29 completion mode. FILE and LINE are used to provide better test 30 location information in case the check fails. */ 31 32static void 33check_make_paramless (const char *file, int line, 34 enum language lang, 35 const char *name, const char *expected, 36 bool completion_mode) 37{ 38 lookup_name_info lookup_name (name, symbol_name_match_type::FULL, 39 completion_mode, true /* ignore_parameters */); 40 const char *result = lookup_name.language_lookup_name (lang); 41 42 if (strcmp (result, expected) != 0) 43 { 44 error (_("%s:%d: make-paramless self-test failed: (completion=%d, lang=%d) " 45 "\"%s\" -> \"%s\", expected \"%s\""), 46 file, line, completion_mode, lang, name, 47 result, expected); 48 } 49} 50 51static void 52run_tests () 53{ 54 /* Helper for CHECK and CHECK_INCOMPL. */ 55#define CHECK_1(INCOMPLETE, LANG, NAME, EXPECTED) \ 56 do \ 57 { \ 58 check_make_paramless (__FILE__, __LINE__, \ 59 LANG, NAME, \ 60 (INCOMPLETE) ? "" : (EXPECTED), false); \ 61 check_make_paramless (__FILE__, __LINE__, \ 62 LANG, NAME, EXPECTED, true); \ 63 } \ 64 while (0) 65 66 /* Check that removing parameter info out of NAME produces EXPECTED. 67 Checks both normal and completion modes. */ 68#define CHECK(LANG, NAME, EXPECTED) \ 69 CHECK_1(false, LANG, NAME, EXPECTED) 70 71 /* Similar, but used when NAME is incomplete -- i.e., NAME has 72 unbalanced parentheses. In this case, looking for the exact name 73 should fail / return empty. */ 74#define CHECK_INCOMPL(LANG, NAME, EXPECTED) \ 75 CHECK_1 (true, LANG, NAME, EXPECTED) 76 77 /* None of these languages support function overloading like C++ 78 does, so building a nameless lookup name ends up being just the 79 same as any other lookup name. Mainly this serves as smoke test 80 that C++-specific code doesn't mess up with other languages that 81 use some other scoping character ('.' vs '::'). */ 82 CHECK (language_ada, "pck.ada_hello", "pck__ada_hello"); 83 CHECK (language_go, "pck.go_hello", "pck.go_hello"); 84 CHECK (language_fortran, "mod::func", "mod::func"); 85 86 /* D does support function overloading similar to C++, but we're 87 missing support for stripping parameters. At least make sure the 88 input name is preserved unmodified. */ 89 CHECK (language_d, "pck.d_hello", "pck.d_hello"); 90 91 /* Just a few basic tests to make sure 92 lookup_name_info::make_paramless is well integrated with 93 cp_remove_params_if_any. gdb/cp-support.c has comprehensive 94 testing of C++ specifics. */ 95 CHECK (language_cplus, "function()", "function"); 96 CHECK (language_cplus, "function() const", "function"); 97 CHECK (language_cplus, "A::B::C()", "A::B::C"); 98 CHECK (language_cplus, "A::B::C", "A::B::C"); 99 100#undef CHECK 101#undef CHECK_INCOMPL 102} 103 104}} // namespace selftests::lookup_name 105 106void _initialize_lookup_name_info_selftests (); 107void 108_initialize_lookup_name_info_selftests () 109{ 110 selftests::register_test ("lookup_name_info", 111 selftests::lookup_name::run_tests); 112} 113