diff options
author | Jason Merrill <jason@redhat.com> | 2024-01-19 13:11:05 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-01-19 14:21:14 -0500 |
commit | 1338ad23ff3c1e4f552cdb64e36cef12eda2e050 (patch) | |
tree | 11e50fb75079322dde048e94244537796430878a /gcc/cp | |
parent | 631a922e5c8578a1c878b69f1651d482b661ef4a (diff) | |
download | gcc-1338ad23ff3c1e4f552cdb64e36cef12eda2e050.zip gcc-1338ad23ff3c1e4f552cdb64e36cef12eda2e050.tar.gz gcc-1338ad23ff3c1e4f552cdb64e36cef12eda2e050.tar.bz2 |
c++: requires and using-decl [PR113498]
get_template_info was crashing because it assumed that any decl with
DECL_LANG_SPECIFIC could use DECL_TEMPLATE_INFO. It's more complicated than
that.
PR c++/113498
gcc/cp/ChangeLog:
* pt.cc (decl_template_info): New fn.
(get_template_info): Use it.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/concepts-using4.C: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/pt.cc | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index fbbca46..7401353 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -339,6 +339,32 @@ build_template_info (tree template_decl, tree template_args) return result; } +/* DECL_TEMPLATE_INFO, if applicable, or NULL_TREE. */ + +static tree +decl_template_info (const_tree decl) +{ + /* This needs to match template_info_decl_check. */ + if (DECL_LANG_SPECIFIC (decl)) + switch (TREE_CODE (decl)) + { + case FUNCTION_DECL: + if (DECL_THUNK_P (decl)) + break; + gcc_fallthrough (); + case VAR_DECL: + case FIELD_DECL: + case TYPE_DECL: + case CONCEPT_DECL: + case TEMPLATE_DECL: + return DECL_TEMPLATE_INFO (decl); + + default: + break; + } + return NULL_TREE; +} + /* Return the template info node corresponding to T, whatever T is. */ tree @@ -353,8 +379,8 @@ get_template_info (const_tree t) || TREE_CODE (t) == PARM_DECL) return NULL; - if (DECL_P (t) && DECL_LANG_SPECIFIC (t)) - tinfo = DECL_TEMPLATE_INFO (t); + if (DECL_P (t)) + tinfo = decl_template_info (t); if (!tinfo && DECL_IMPLICIT_TYPEDEF_P (t)) t = TREE_TYPE (t); |