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.
Changes
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
---
Full diff: https://github.com/llvm/llvm-project/pull/90467.diff
6 Files Affected:
- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+2)
- (modified) clang/lib/Sema/DeclSpec.cpp (+4)
- (modified) clang/test/Parser/altivec.c (+14)
- (modified) clang/test/Parser/cxx-altivec.cpp (+14)
- (modified) clang/test/Sema/zvector.c (+12)
- (modified) clang/test/Sema/zvector2.c (+4)
``````````diff
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index fdca82934cb4dc..8853739969a4ca 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;
diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp
index 5f63c857c43067..71225a7ed5ee62 100644
--- a/clang/lib/Sema/DeclSpec.cpp
+++ b/clang/lib/Sema/DeclSpec.cpp
@@ -1191,6 +1191,10 @@ void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {
// Validate and finalize AltiVec vector declspec.
if (TypeAltiVecVector) {
+ // Complex vector types are not supported.
+ if (TypeSpecComplex != TSC_unspecified)
+ S.Diag(TSCLoc, diag::err_invalid_vector_complex_decl_spec);
+
// No vector long long without VSX (or ZVector).
if ((getTypeSpecWidth() == TypeSpecifierWidth::LongLong) &&
!S.Context.getTargetInfo().hasFeature("vsx") &&
diff --git a/clang/test/Parser/altivec.c b/clang/test/Parser/altivec.c
index daee5eae4d8430..f63a2bfa6abdc3 100644
--- a/clang/test/Parser/altivec.c
+++ b/clang/test/Parser/altivec.c
@@ -110,6 +110,20 @@ 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'}}
+#ifndef __VSX__
+ // expected-error@-2 {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}
+#endif
+vector long double _Complex v_cld; // expected-error {{cannot use '_Complex' with '__vector'}}
+ // expected-error@-1 {{cannot use 'long double' 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'}}
+#ifndef __VSX__
+ // expected-error@-2 {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}
+#endif
+__vector long double _Complex v_cld2;// expected-error {{cannot use '_Complex' with '__vector'}}
+ // expected-error@-1 {{cannot use 'long double' 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 6da36663422b49..c071f333e2206f 100644
--- a/clang/test/Parser/cxx-altivec.cpp
+++ b/clang/test/Parser/cxx-altivec.cpp
@@ -111,6 +111,20 @@ 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'}}
+#ifndef __VSX__
+ // expected-error@-2 {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}
+#endif
+vector long double _Complex v_cld; // expected-error {{cannot use '_Complex' with '__vector'}}
+ // expected-error@-1 {{cannot use 'long double' 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'}}
+#ifndef __VSX__
+ // expected-error@-2 {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}
+#endif
+__vector long double _Complex v_cld2;// expected-error {{cannot use '_Complex' with '__vector'}}
+ // expected-error@-1 {{cannot use 'long double' 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 798b12bd50b767..6f16debcafa699 100644
--- a/clang/test/Sema/zvector.c
+++ b/clang/test/Sema/zvector.c
@@ -22,6 +22,12 @@ 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 'float' with '__vector'}}
+ // expected-error@-1 {{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 'long double' with '__vector'}}
+ // expected-error@-1 {{cannot use '_Complex' with '__vector'}}
signed char sc_scalar;
unsigned char uc_scalar;
@@ -53,6 +59,12 @@ __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 'float' with '__vector'}}
+ // expected-error@-1 {{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 'long double' with '__vector'}}
+ // expected-error@-1 {{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 a4e0a9e2c3f18f..8a440374f335f5 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];
``````````
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