1 /* Utilities for querying and manipulating type trees. 2 Copyright (C) 2013-2018 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_TREE 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 find_type_usage (tree t, bool (*pred) (const_tree)) 35 { 36 enum tree_code code; 37 if (pred (t)) 38 return t; 39 40 code = TREE_CODE (t); 41 42 if (code == POINTER_TYPE || code == REFERENCE_TYPE 43 || code == PARM_DECL || code == OFFSET_TYPE 44 || code == FUNCTION_TYPE || code == METHOD_TYPE 45 || code == ARRAY_TYPE) 46 return find_type_usage (TREE_TYPE (t), pred); 47 48 if (TYPE_PTRMEMFUNC_P (t)) 49 return find_type_usage 50 (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (t)), pred); 51 52 return NULL_TREE; 53 } 54 55 #endif // GCC_CP_TYPE_UTILS_H 56