summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/vector.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2019-09-13 06:02:15 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2019-09-13 06:02:15 +0000
commitc624510f134ceee9bdb5308b6f4892890c61938f (patch)
tree82dbe8f9867b26691120175840d36f36e431d2fa /clang/test/SemaCXX/vector.cpp
parent804e0c507da4065326a88d4966115c55e0920dc8 (diff)
downloadbcm5719-llvm-c624510f134ceee9bdb5308b6f4892890c61938f.tar.gz
bcm5719-llvm-c624510f134ceee9bdb5308b6f4892890c61938f.zip
For PR17164: split -fno-lax-vector-conversion into three different
levels: -- none: no lax vector conversions [new GCC default] -- integer: only conversions between integer vectors [old GCC default] -- all: all conversions between same-size vectors [Clang default] For now, Clang still defaults to "all" mode, but per my proposal on cfe-dev (2019-04-10) the default will be changed to "integer" as soon as that doesn't break lots of testcases. (Eventually I'd like to change the default to "none" to match GCC and general sanity.) Following GCC's behavior, the driver flag -flax-vector-conversions is translated to -flax-vector-conversions=integer. This reinstates r371805, reverted in r371813, with an additional fix for lldb. llvm-svn: 371817
Diffstat (limited to 'clang/test/SemaCXX/vector.cpp')
-rw-r--r--clang/test/SemaCXX/vector.cpp82
1 files changed, 62 insertions, 20 deletions
diff --git a/clang/test/SemaCXX/vector.cpp b/clang/test/SemaCXX/vector.cpp
index 295e1e17323..67e5a94cb10 100644
--- a/clang/test/SemaCXX/vector.cpp
+++ b/clang/test/SemaCXX/vector.cpp
@@ -1,6 +1,8 @@
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=c++98 %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=c++11 %s
+// RUN: %clang_cc1 -flax-vector-conversions=all -triple x86_64-apple-darwin10 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -flax-vector-conversions=all -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=c++98 %s
+// RUN: %clang_cc1 -flax-vector-conversions=all -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=c++11 %s
+// RUN: %clang_cc1 -flax-vector-conversions=integer -triple x86_64-apple-darwin10 -fsyntax-only -verify %s -DNO_LAX_FLOAT
+// RUN: %clang_cc1 -flax-vector-conversions=none -triple x86_64-apple-darwin10 -fsyntax-only -verify %s -DNO_LAX_FLOAT -DNO_LAX_INT
typedef char char16 __attribute__ ((__vector_size__ (16)));
typedef long long longlong16 __attribute__ ((__vector_size__ (16)));
@@ -8,13 +10,19 @@ typedef char char16_e __attribute__ ((__ext_vector_type__ (16)));
typedef long long longlong16_e __attribute__ ((__ext_vector_type__ (2)));
// Test overloading and function calls with vector types.
-void f0(char16);
+void f0(char16); // expected-note 0+{{candidate}}
void f0_test(char16 c16, longlong16 ll16, char16_e c16e, longlong16_e ll16e) {
f0(c16);
f0(ll16);
+#ifdef NO_LAX_INT
+ // expected-error@-2 {{no matching function}}
+#endif
f0(c16e);
f0(ll16e);
+#ifdef NO_LAX_INT
+ // expected-error@-2 {{no matching function}}
+#endif
}
int &f1(char16);
@@ -27,12 +35,14 @@ void f1_test(char16 c16, longlong16 ll16, char16_e c16e, longlong16_e ll16e) {
float &fr2 = f1(ll16e);
}
-void f2(char16_e); // expected-note{{no known conversion from 'longlong16_e' (vector of 2 'long long' values) to 'char16_e' (vector of 16 'char' values) for 1st argument}} \
- // expected-note{{candidate function not viable: no known conversion from 'convertible_to<longlong16_e>' to 'char16_e' (vector of 16 'char' values) for 1st argument}}
+void f2(char16_e); // expected-note 0+{{candidate}}
void f2_test(char16 c16, longlong16 ll16, char16_e c16e, longlong16_e ll16e) {
f2(c16);
f2(ll16);
+#ifdef NO_LAX_INT
+ // expected-error@-2 {{no matching function}}
+#endif
f2(c16e);
f2(ll16e); // expected-error{{no matching function}}
f2('a');
@@ -58,6 +68,11 @@ void conditional(bool Cond, char16 c16, longlong16 ll16, char16_e c16e,
(void)(Cond? c16 : ll16);
(void)(Cond? ll16e : c16e);
(void)(Cond? ll16e : c16);
+#ifdef NO_LAX_INT
+ // expected-error@-4 {{cannot convert}}
+ // expected-error@-4 {{cannot convert}}
+ // expected-error@-4 {{cannot convert}}
+#endif
}
// Test C++ cast'ing of vector types.
@@ -85,9 +100,16 @@ void casts(longlong16 ll16, longlong16_e ll16e) {
// static_cast
(void)static_cast<char16>(ll16);
(void)static_cast<char16_e>(ll16);
+#ifdef NO_LAX_INT
+ // expected-error@-3 {{not allowed}}
+ // expected-error@-3 {{not allowed}}
+#endif
(void)static_cast<longlong16>(ll16);
(void)static_cast<longlong16_e>(ll16);
(void)static_cast<char16>(ll16e);
+#ifdef NO_LAX_INT
+ // expected-error@-2 {{not allowed}}
+#endif
(void)static_cast<char16_e>(ll16e); // expected-error{{static_cast from 'longlong16_e' (vector of 2 'long long' values) to 'char16_e' (vector of 16 'char' values) is not allowed}}
(void)static_cast<longlong16>(ll16e);
(void)static_cast<longlong16_e>(ll16e);
@@ -121,10 +143,19 @@ void test_implicit_conversions(bool Cond, char16 c16, longlong16 ll16,
convertible_to<char16_e&> rto_c16e) {
f0(to_c16);
f0(to_ll16);
+#ifdef NO_LAX_INT
+ // expected-error@-2 {{no matching function}}
+#endif
f0(to_c16e);
f0(to_ll16e);
+#ifdef NO_LAX_INT
+ // expected-error@-2 {{no matching function}}
+#endif
f2(to_c16);
f2(to_ll16);
+#ifdef NO_LAX_INT
+ // expected-error@-2 {{no matching function}}
+#endif
f2(to_c16e);
f2(to_ll16e); // expected-error{{no matching function}}
@@ -193,6 +224,10 @@ void test_implicit_conversions(bool Cond, char16 c16, longlong16 ll16,
// These 2 are convertible with -flax-vector-conversions (default)
(void)(Cond? to_c16 : to_ll16);
(void)(Cond? to_c16e : to_ll16e);
+#ifdef NO_LAX_INT
+ // expected-error@-3 {{cannot convert}}
+ // expected-error@-3 {{cannot convert}}
+#endif
}
typedef float fltx2 __attribute__((__vector_size__(8)));
@@ -203,6 +238,10 @@ typedef double dblx4 __attribute__((__vector_size__(32)));
void accept_fltx2(fltx2); // expected-note{{candidate function not viable: no known conversion from 'double' to 'fltx2' (vector of 2 'float' values) for 1st argument}}
void accept_fltx4(fltx4);
void accept_dblx2(dblx2);
+#ifdef NO_LAX_FLOAT
+// expected-note@-3 {{no known conversion}}
+// expected-note@-3 {{no known conversion}}
+#endif
void accept_dblx4(dblx4);
void accept_bool(bool); // expected-note{{candidate function not viable: no known conversion from 'fltx2' (vector of 2 'float' values) to 'bool' for 1st argument}}
@@ -214,9 +253,12 @@ void test(fltx2 fltx2_val, fltx4 fltx4_val, dblx2 dblx2_val, dblx4 dblx4_val) {
accept_dblx4(dblx4_val);
// Same-size conversions
- // FIXME: G++ rejects these conversions, we accept them. Revisit this!
accept_fltx4(dblx2_val);
accept_dblx2(fltx4_val);
+#ifdef NO_LAX_FLOAT
+ // expected-error@-3 {{no matching function}}
+ // expected-error@-3 {{no matching function}}
+#endif
// Conversion to bool.
accept_bool(fltx2_val); // expected-error{{no matching function for call to 'accept_bool'}}
@@ -227,9 +269,9 @@ void test(fltx2 fltx2_val, fltx4 fltx4_val, dblx2 dblx2_val, dblx4 dblx4_val) {
typedef int intx4 __attribute__((__vector_size__(16)));
typedef int inte4 __attribute__((__ext_vector_type__(4)));
-typedef int flte4 __attribute__((__ext_vector_type__(4)));
+typedef float flte4 __attribute__((__ext_vector_type__(4)));
-void test_mixed_vector_types(fltx4 f, intx4 n, flte4 g, flte4 m) {
+void test_mixed_vector_types(fltx4 f, intx4 n, flte4 g, inte4 m) {
(void)(f == g);
(void)(g != f);
(void)(f <= g);
@@ -295,40 +337,40 @@ typedef bool bad __attribute__((__vector_size__(16))); // expected-error {{inva
namespace Templates {
template <typename Elt, unsigned Size>
struct TemplateVectorType {
- typedef Elt __attribute__((__vector_size__(Size))) type;
+ typedef Elt __attribute__((__vector_size__(Size))) type; // #1
};
template <int N, typename T>
struct PR15730 {
typedef T __attribute__((vector_size(N * sizeof(T)))) type;
- typedef T __attribute__((vector_size(8192))) type2;
- typedef T __attribute__((vector_size(3))) type3;
+ typedef T __attribute__((vector_size(8192))) type2; // #2
+ typedef T __attribute__((vector_size(3))) type3; // #3
};
void Init() {
const TemplateVectorType<float, 32>::type Works = {};
const TemplateVectorType<int, 32>::type Works2 = {};
- // expected-error@298 {{invalid vector element type 'bool'}}
+ // expected-error@#1 {{invalid vector element type 'bool'}}
// expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<bool, 32>' requested here}}
const TemplateVectorType<bool, 32>::type NoBool;
- // expected-error@298 {{invalid vector element type 'int __attribute__((ext_vector_type(4)))' (vector of 4 'int' values)}}
+ // expected-error@#1 {{invalid vector element type 'int __attribute__((ext_vector_type(4)))' (vector of 4 'int' values)}}
// expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int __attribute__((ext_vector_type(4))), 32>' requested here}}
const TemplateVectorType<vi4, 32>::type NoComplex;
- // expected-error@298 {{vector size not an integral multiple of component size}}
+ // expected-error@#1 {{vector size not an integral multiple of component size}}
// expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 33>' requested here}}
const TemplateVectorType<int, 33>::type BadSize;
- // expected-error@298 {{vector size too large}}
+ // expected-error@#1 {{vector size too large}}
// expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 8192>' requested here}}
const TemplateVectorType<int, 8192>::type TooLarge;
- // expected-error@298 {{zero vector size}}
+ // expected-error@#1 {{zero vector size}}
// expected-note@+1 {{in instantiation of template class 'Templates::TemplateVectorType<int, 0>' requested here}}
const TemplateVectorType<int, 0>::type Zero;
- // expected-error@304 {{vector size too large}}
- // expected-error@305 {{vector size not an integral multiple of component size}}
+ // expected-error@#2 {{vector size too large}}
+ // expected-error@#3 {{vector size not an integral multiple of component size}}
// expected-note@+1 {{in instantiation of template class 'Templates::PR15730<8, int>' requested here}}
const PR15730<8, int>::type PR15730_1 = {};
- // expected-error@304 {{vector size too large}}
+ // expected-error@#2 {{vector size too large}}
// expected-note@+1 {{in instantiation of template class 'Templates::PR15730<8, char>' requested here}}
const PR15730<8, char>::type2 PR15730_2 = {};
}
OpenPOWER on IntegriCloud