aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.cc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2022-09-29 09:18:40 -0400
committerPatrick Palka <ppalka@redhat.com>2022-09-29 09:18:40 -0400
commit9ca147154074a0de548138b4e73477e94903a855 (patch)
tree689d3428db5ceea4aa86f800a8d59a1c8e9d300c /gcc/cp/parser.cc
parent817e878a31671fcb68492bce35aa1ac87e08efdb (diff)
downloadgcc-9ca147154074a0de548138b4e73477e94903a855.zip
gcc-9ca147154074a0de548138b4e73477e94903a855.tar.gz
gcc-9ca147154074a0de548138b4e73477e94903a855.tar.bz2
c++: implement __remove_cv, __remove_reference and __remove_cvref
This implements builtins for std::remove_cv, std::remove_reference and std::remove_cvref using TRAIT_TYPE from the previous patch. gcc/c-family/ChangeLog: * c-common.cc (c_common_reswords): Add __remove_cv, __remove_reference and __remove_cvref. * c-common.h (enum rid): Add RID_REMOVE_CV, RID_REMOVE_REFERENCE and RID_REMOVE_CVREF. gcc/cp/ChangeLog: * constraint.cc (diagnose_trait_expr): Handle CPTK_REMOVE_CV, CPTK_REMOVE_REFERENCE and CPTK_REMOVE_CVREF. * cp-objcp-common.cc (names_builtin_p): Likewise. * cp-tree.h (enum cp_trait_kind): Add CPTK_REMOVE_CV, CPTK_REMOVE_REFERENCE and CPTK_REMOVE_CVREF. * cxx-pretty-print.cc (pp_cxx_trait): Handle CPTK_REMOVE_CV, CPTK_REMOVE_REFERENCE and CPTK_REMOVE_CVREF. * parser.cc (cp_keyword_starts_decl_specifier_p): Return true for RID_REMOVE_CV, RID_REMOVE_REFERENCE and RID_REMOVE_CVREF. (cp_parser_trait): Handle RID_REMOVE_CV, RID_REMOVE_REFERENCE and RID_REMOVE_CVREF. (cp_parser_simple_type_specifier): Likewise. * semantics.cc (finish_trait_type): Likewise. libstdc++-v3/ChangeLog: * include/bits/unique_ptr.h (unique_ptr<_Tp[], _Dp>): Remove __remove_cv and use __remove_cv_t instead. gcc/testsuite/ChangeLog: * g++.dg/ext/has-builtin-1.C: Test existence of __remove_cv, __remove_reference and __remove_cvref. * g++.dg/ext/remove_cv.C: New test. * g++.dg/ext/remove_reference.C: New test. * g++.dg/ext/remove_cvref.C: New test.
Diffstat (limited to 'gcc/cp/parser.cc')
-rw-r--r--gcc/cp/parser.cc18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 9f5e2c2..d592d78 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -1147,6 +1147,9 @@ cp_keyword_starts_decl_specifier_p (enum rid keyword)
/* C++11 extensions. */
case RID_DECLTYPE:
case RID_UNDERLYING_TYPE:
+ case RID_REMOVE_CV:
+ case RID_REMOVE_REFERENCE:
+ case RID_REMOVE_CVREF:
case RID_CONSTEXPR:
/* C++20 extensions. */
case RID_CONSTINIT:
@@ -11027,6 +11030,18 @@ cp_parser_trait (cp_parser* parser, enum rid keyword)
kind = CPTK_REF_CONVERTS_FROM_TEMPORARY;
binary = true;
break;
+ case RID_REMOVE_CV:
+ kind = CPTK_REMOVE_CV;
+ type = true;
+ break;
+ case RID_REMOVE_REFERENCE:
+ kind = CPTK_REMOVE_REFERENCE;
+ type = true;
+ break;
+ case RID_REMOVE_CVREF:
+ kind = CPTK_REMOVE_CVREF;
+ type = true;
+ break;
default:
gcc_unreachable ();
}
@@ -19867,6 +19882,9 @@ cp_parser_simple_type_specifier (cp_parser* parser,
return type;
case RID_UNDERLYING_TYPE:
+ case RID_REMOVE_CV:
+ case RID_REMOVE_REFERENCE:
+ case RID_REMOVE_CVREF:
type = cp_parser_trait (parser, token->keyword);
if (decl_specs)
cp_parser_set_decl_spec_type (decl_specs, type,