aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/init.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-12-06 18:22:24 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-12-06 18:22:24 +0000
commit02a32ab4a6175f377a4b6f53159c6aae9a24a7cc (patch)
treeedbc148180bd6cb0282ec8b9b5fd5c124f0cdfd4 /gcc/cp/init.c
parent1e8f5d49d791018310b9df540a3c19f7330351f6 (diff)
downloadgcc-02a32ab4a6175f377a4b6f53159c6aae9a24a7cc.zip
gcc-02a32ab4a6175f377a4b6f53159c6aae9a24a7cc.tar.gz
gcc-02a32ab4a6175f377a4b6f53159c6aae9a24a7cc.tar.bz2
[C++] Pass type uses through the verify_type_context hook
This patch makes the C++ frontend work with the verify_type_context hook. We need some new type contexts for features that don't exist in C, but otherwise the patch is very similar to the C one. TCTX_CAPTURE_BY_COPY could really be treated as an instance of TCTX_FIELD, but the error message is better if we split it out. 2019-12-06 Richard Sandiford <richard.sandiford@arm.com> gcc/ * target.h (TCTX_ALLOCATION, TCTX_DEALLOCATION, TCTX_EXCEPTIONS) (TCTX_CAPTURE_BY_COPY): New type_context_kinds. * config/aarch64/aarch64-sve-builtins.cc (verify_type_context): Handle them. gcc/cp/ * decl.c (start_decl_1): Use verify_type_context to check whether the target allows variables of a particular type to have static or thread-local storage duration. (check_array_initializer): Use verify_type_context to check whether the target allows a particular type to be used as an array element. (create_array_type_for_decl): Likewise. (cp_finish_decl): Use verify_type_context to check whether the target allows static member variables of a particular type. (grokdeclarator): Likewise. Also use verify_type_context to check whether the target allows non-static member variables of a particular type. * except.c: Include target.h. (is_admissible_throw_operand_or_catch_parameter): Use verify_type_context to check whether the target allows particular types to be thrown and caught. * typeck2.c (add_exception_specifier): Likewise. * init.c (build_new_1): Use verify_type_context to check whether the target allows particular types to be dynamically allocated. (build_vec_delete_1, build_delete): Use verify_type_context to check whether the target allows particular types to be deleted. * lambda.c (add_capture): Use verify_type_context to check whether the target allows particular types to be captured by copy. * pt.c: Include target.h. (instantiate_class_template_1): Use verify_type_context to check whether the target allows non-static member variables of a particular type. * typeck.c (cxx_alignof_expr): Use verify_type_context to check whether the target allows the alignment of a particular type to be measured. (pointer_diff, cp_build_unary_op): Use verify_type_context to check whether the target allows arithmetic involving pointers to particular types. gcc/testsuite/ * g++.dg/ext/sve-sizeless-1.C: New test. * g++.dg/ext/sve-sizeless-2.C: Likewise. From-SVN: r279058
Diffstat (limited to 'gcc/cp/init.c')
-rw-r--r--gcc/cp/init.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index aa48f80..e40afe2 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -3058,6 +3058,10 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
complain);
}
+ if (!verify_type_context (input_location, TCTX_ALLOCATION, elt_type,
+ !(complain & tf_error)))
+ return error_mark_node;
+
if (variably_modified_type_p (elt_type, NULL_TREE) && (complain & tf_error))
{
error ("variably modified type not allowed in new-expression");
@@ -3942,6 +3946,10 @@ build_vec_delete_1 (tree base, tree maxindex, tree type,
if (base == error_mark_node || maxindex == error_mark_node)
return error_mark_node;
+ if (!verify_type_context (input_location, TCTX_DEALLOCATION, type,
+ !(complain & tf_error)))
+ return error_mark_node;
+
if (!COMPLETE_TYPE_P (type))
{
if (complain & tf_warning)
@@ -4827,6 +4835,11 @@ build_delete (tree otype, tree addr, special_function_kind auto_delete,
if (!VOID_TYPE_P (type))
{
complete_type (type);
+ if (deleting
+ && !verify_type_context (input_location, TCTX_DEALLOCATION, type,
+ !(complain & tf_error)))
+ return error_mark_node;
+
if (!COMPLETE_TYPE_P (type))
{
if (complain & tf_warning)