[C++] Pass type uses through the verify_type_context hook
authorRichard Sandiford <richard.sandiford@arm.com>
Fri, 6 Dec 2019 18:22:24 +0000 (18:22 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 6 Dec 2019 18:22:24 +0000 (18:22 +0000)
commit02a32ab4a6175f377a4b6f53159c6aae9a24a7cc
treeedbc148180bd6cb0282ec8b9b5fd5c124f0cdfd4
parent1e8f5d49d791018310b9df540a3c19f7330351f6
[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
14 files changed:
gcc/ChangeLog
gcc/config/aarch64/aarch64-sve-builtins.cc
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/except.c
gcc/cp/init.c
gcc/cp/lambda.c
gcc/cp/pt.c
gcc/cp/typeck.c
gcc/cp/typeck2.c
gcc/target.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/sve-sizeless-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/sve-sizeless-2.C [new file with mode: 0644]