diff options
author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2024-04-30 11:34:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-30 11:34:34 +0200 |
commit | f73e87f53f5d8a86c29251dedc9dbd264179203a (patch) | |
tree | a7bc393055ffbec56e6216359f505bbf0a0648e8 /clang | |
parent | 10aab63c9cb49d3ddfbe2cf8992de433efeef6f1 (diff) | |
download | llvm-f73e87f53f5d8a86c29251dedc9dbd264179203a.zip llvm-f73e87f53f5d8a86c29251dedc9dbd264179203a.tar.gz llvm-f73e87f53f5d8a86c29251dedc9dbd264179203a.tar.bz2 |
[Clang][Sema] Do not accept "vector _Complex" for AltiVec/ZVector (#90467)
The AltiVec (POWER) and ZVector (IBM Z) language extensions do not
support using the "vector" keyword when the element type is a complex
type, but current code does not verify this.
Add a Sema check and diagnostic for this case.
Fixes: https://github.com/llvm/llvm-project/issues/88399
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/DeclSpec.cpp | 5 | ||||
-rw-r--r-- | clang/test/Parser/altivec.c | 6 | ||||
-rw-r--r-- | clang/test/Parser/cxx-altivec.cpp | 6 | ||||
-rw-r--r-- | clang/test/Sema/zvector.c | 8 | ||||
-rw-r--r-- | clang/test/Sema/zvector2.c | 4 |
6 files changed, 30 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f72d5c25..5cb3c80 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -307,6 +307,8 @@ def err_invalid_vector_long_long_decl_spec : Error < "POWER7 or later) to be enabled">; def err_invalid_vector_long_double_decl_spec : Error< "cannot use 'long double' with '__vector'">; +def err_invalid_vector_complex_decl_spec : Error< + "cannot use '_Complex' with '__vector'">; def warn_vector_long_decl_spec_combination : Warning< "Use of 'long' with '__vector' is deprecated">, InGroup<Deprecated>; diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp index 5f63c85..60e8189 100644 --- a/clang/lib/Sema/DeclSpec.cpp +++ b/clang/lib/Sema/DeclSpec.cpp @@ -1202,7 +1202,10 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) { !S.Context.getTargetInfo().hasFeature("power8-vector")) S.Diag(TSTLoc, diag::err_invalid_vector_int128_decl_spec); - if (TypeAltiVecBool) { + // Complex vector types are not supported. + if (TypeSpecComplex != TSC_unspecified) + S.Diag(TSCLoc, diag::err_invalid_vector_complex_decl_spec); + else if (TypeAltiVecBool) { // Sign specifiers are not allowed with vector bool. (PIM 2.1) if (getTypeSpecSign() != TypeSpecifierSign::Unspecified) { S.Diag(TSSLoc, diag::err_invalid_vector_bool_decl_spec) diff --git a/clang/test/Parser/altivec.c b/clang/test/Parser/altivec.c index daee5ea..445369f 100644 --- a/clang/test/Parser/altivec.c +++ b/clang/test/Parser/altivec.c @@ -110,6 +110,12 @@ vector __bool long long v_bll4; // expected-error {{use of 'long long' with #endif __vector long double vv_ld3; // expected-error {{cannot use 'long double' with '__vector'}} vector long double v_ld4; // expected-error {{cannot use 'long double' with '__vector'}} +vector float _Complex v_cf; // expected-error {{cannot use '_Complex' with '__vector'}} +vector double _Complex v_cd; // expected-error {{cannot use '_Complex' with '__vector'}} +vector long double _Complex v_cld; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector float _Complex v_cf2; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector double _Complex v_cd2; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector long double _Complex v_cld2;// expected-error {{cannot use '_Complex' with '__vector'}} vector bool float v_bf; // expected-error {{cannot use 'float' with '__vector bool'}} vector bool double v_bd; // expected-error {{cannot use 'double' with '__vector bool'}} vector bool pixel v_bp; // expected-error {{cannot use '__pixel' with '__vector bool'}} diff --git a/clang/test/Parser/cxx-altivec.cpp b/clang/test/Parser/cxx-altivec.cpp index 6da3666..5cb760d 100644 --- a/clang/test/Parser/cxx-altivec.cpp +++ b/clang/test/Parser/cxx-altivec.cpp @@ -111,6 +111,12 @@ vector __bool long long v_bll4; // expected-error {{use of 'long long' with #endif __vector long double vv_ld3; // expected-error {{cannot use 'long double' with '__vector'}} vector long double v_ld4; // expected-error {{cannot use 'long double' with '__vector'}} +vector float _Complex v_cf; // expected-error {{cannot use '_Complex' with '__vector'}} +vector double _Complex v_cd; // expected-error {{cannot use '_Complex' with '__vector'}} +vector long double _Complex v_cld; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector float _Complex v_cf2; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector double _Complex v_cd2; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector long double _Complex v_cld2;// expected-error {{cannot use '_Complex' with '__vector'}} // FIXME: why is this diagnostic different from the others? vector bool v_b; // expected-error {{a type specifier is required for all declarations}} vector bool float v_bf; // expected-error {{cannot use 'float' with '__vector bool'}} diff --git a/clang/test/Sema/zvector.c b/clang/test/Sema/zvector.c index 798b12b..900c39a 100644 --- a/clang/test/Sema/zvector.c +++ b/clang/test/Sema/zvector.c @@ -22,6 +22,10 @@ vector double fd, fd2; vector long ll; // expected-error {{cannot use 'long' with '__vector'}} vector float ff; // expected-error {{cannot use 'float' with '__vector'}} +vector long double ld; // expected-error {{cannot use 'long double' with '__vector'}} +vector float _Complex cf; // expected-error {{cannot use '_Complex' with '__vector'}} +vector double _Complex cd; // expected-error {{cannot use '_Complex' with '__vector'}} +vector long double _Complex cld; // expected-error {{cannot use '_Complex' with '__vector'}} signed char sc_scalar; unsigned char uc_scalar; @@ -53,6 +57,10 @@ __vector bool long long bl3; __vector double fd3; __vector long ll3; // expected-error {{cannot use 'long' with '__vector'}} __vector float ff3; // expected-error {{cannot use 'float' with '__vector'}} +__vector long double ld3; // expected-error {{cannot use 'long double' with '__vector'}} +__vector float _Complex cf3; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector double _Complex cd3; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector long double _Complex cld3; // expected-error {{cannot use '_Complex' with '__vector'}} // Likewise for __bool vector __bool char bc4; diff --git a/clang/test/Sema/zvector2.c b/clang/test/Sema/zvector2.c index a4e0a9e..8a44037 100644 --- a/clang/test/Sema/zvector2.c +++ b/clang/test/Sema/zvector2.c @@ -25,6 +25,10 @@ vector float ff, ff2; // Verify that __vector is also recognized __vector float ff3; +// With z14 we support vector float, but still no vector _Complex float. +vector float _Complex cf; // expected-error {{cannot use '_Complex' with '__vector'}} +__vector float _Complex cf3; // expected-error {{cannot use '_Complex' with '__vector'}} + // Verify operation of vec_step int res_ff[vec_step(ff) == 4 ? 1 : -1]; |