Line data Source code
1 : /* Utilities for querying and manipulating type trees. 2 : Copyright (C) 2013-2023 Free Software Foundation, Inc. 3 : 4 : This file is part of GCC. 5 : 6 : GCC is free software; you can redistribute it and/or modify 7 : it under the terms of the GNU General Public License as published by 8 : the Free Software Foundation; either version 3, or (at your option) 9 : any later version. 10 : 11 : GCC is distributed in the hope that it will be useful, 12 : but WITHOUT ANY WARRANTY; without even the implied warranty of 13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 : GNU General Public License for more details. 15 : 16 : You should have received a copy of the GNU General Public License 17 : along with GCC; see the file COPYING3. If not see 18 : <http://www.gnu.org/licenses/>. */ 19 : 20 : #ifndef GCC_CP_TYPE_UTILS_H 21 : #define GCC_CP_TYPE_UTILS_H 22 : 23 : /* Returns the first tree within T that is directly matched by PRED. T may be a 24 : type or PARM_DECL and is incrementally decomposed toward its type-specifier 25 : until a match is found. NULL is returned if PRED does not match any 26 : part of T. 27 : 28 : This is primarily intended for detecting whether T uses `auto' or a concept 29 : identifier. Since either of these can only appear as a type-specifier for 30 : the declaration in question, only top-level qualifications are traversed; 31 : find_type_usage does not look through the whole type. */ 32 : 33 : inline tree 34 1748436275 : find_type_usage (tree t, bool (*pred) (const_tree)) 35 : { 36 2133856312 : if (pred (t)) 37 : return t; 38 : 39 2112776180 : enum tree_code code = TREE_CODE (t); 40 : 41 2112776180 : if (code == POINTER_TYPE || code == REFERENCE_TYPE 42 2112776180 : || code == PARM_DECL || code == OFFSET_TYPE 43 1827635338 : || code == FUNCTION_TYPE || code == METHOD_TYPE 44 1758744274 : || code == ARRAY_TYPE) 45 384459165 : return find_type_usage (TREE_TYPE (t), pred); 46 : 47 1728317015 : if (TYPE_PTRMEMFUNC_P (t)) 48 960872 : return find_type_usage 49 960872 : (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (t)), pred); 50 : 51 : return NULL_TREE; 52 : } 53 : 54 : #endif // GCC_CP_TYPE_UTILS_H