This patch adds type checking for static local vector variable in C++ template, both AArch64 SVE and RISCV RVV are of sizeless type and they all have this issue.
2021-08-06 wangpc <pc.w...@linux.alibaba.com> gcc/cp/ChangeLog * pt.c (tsubst_decl): Add type checking. gcc/testsuite/ChangeLog * g++.target/aarch64/sve/static-var-in-template.C: New test. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 90111e4c786..e3a06ea0858 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7520,6 +7520,12 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, && DECL_INITIALIZED_IN_CLASS_P (decl)) check_static_variable_definition (decl, type); + if (VAR_P (decl) + && DECL_FUNCTION_SCOPE_P (decl) + && TREE_STATIC (decl)) + verify_type_context (DECL_SOURCE_LOCATION (decl), + TCTX_STATIC_STORAGE, type); + if (init && TREE_CODE (decl) == FUNCTION_DECL) { tree clone; diff --git a/gcc/testsuite/g++.target/aarch64/sve/static-var-in-template.C b/gcc/testsuite/g++.target/aarch64/sve/static-var-in-template.C new file mode 100644 index 00000000000..c2395d18d50 --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/sve/static-var-in-template.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +#include <arm_sve.h> + +template <int N> +void f() +{ + static svbool_t pg = svwhilelt_b64(0, N); +} + +int main(int argc, char **argv) +{ + f<2>(); + return 0; +} + +/* { dg-error {SVE type 'svbool_t' does not have a fixed size} } */ -- 2.33.0.windows.1