summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-12-03 01:36:22 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-12-03 01:36:22 +0000
commit0c6124ba82063b05b9c85b63bb29ec354aa1be0b (patch)
treec5cb08e6eb95fe213116ac9bbad149a05d31577a /clang/test/CodeGen
parenta30cee627201032bc7ea66808d057d97f52b852f (diff)
downloadbcm5719-llvm-0c6124ba82063b05b9c85b63bb29ec354aa1be0b.tar.gz
bcm5719-llvm-0c6124ba82063b05b9c85b63bb29ec354aa1be0b.zip
PR17381: Treat undefined behavior during expression evaluation as an unmodeled
side-effect, so that we don't allow speculative evaluation of such expressions during code generation. This caused a diagnostic quality regression, so fix constant expression diagnostics to prefer either the first "can't be constant folded" diagnostic or the first "not a constant expression" diagnostic depending on the kind of evaluation we're doing. This was always the intent, but didn't quite work correctly before. This results in certain initializers that used to be constant initializers to no longer be; in particular, things like: float f = 1e100; are no longer accepted in C. This seems appropriate, as such constructs would lead to code being executed if sanitizers are enabled. llvm-svn: 254574
Diffstat (limited to 'clang/test/CodeGen')
-rw-r--r--clang/test/CodeGen/complex-init-list.c4
-rw-r--r--clang/test/CodeGen/ubsan-conditional.c10
2 files changed, 12 insertions, 2 deletions
diff --git a/clang/test/CodeGen/complex-init-list.c b/clang/test/CodeGen/complex-init-list.c
index bc38e2caf21..fa266b26bb9 100644
--- a/clang/test/CodeGen/complex-init-list.c
+++ b/clang/test/CodeGen/complex-init-list.c
@@ -4,8 +4,8 @@
// of a complex number individually using an initialization list. (There is a
// extensive description and test in test/Sema/complex-init-list.c.)
-_Complex float x = { 1.0f, 1.0f/0.0f };
-// CHECK: @x = global { float, float } { float 1.000000e+00, float 0x7FF0000000000000 }, align 4
+_Complex float x = { 1.0f, -1.0f };
+// CHECK: @x = global { float, float } { float 1.000000e+00, float -1.000000e+00 }, align 4
_Complex float f(float x, float y) { _Complex float z = { x, y }; return z; }
// CHECK-LABEL: define <2 x float> @f
diff --git a/clang/test/CodeGen/ubsan-conditional.c b/clang/test/CodeGen/ubsan-conditional.c
new file mode 100644
index 00000000000..7f63b39a230
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-conditional.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 %s -emit-llvm -fsanitize=float-divide-by-zero -o - | FileCheck %s
+
+_Bool b;
+// CHECK: @f(
+double f() {
+ // CHECK: %[[B:.*]] = load {{.*}} @b
+ // CHECK: %[[COND:.*]] = trunc {{.*}} %[[B]] to i1
+ // CHECK: br i1 %[[COND]]
+ return b ? 0.0 / 0.0 : 0.0;
+}
OpenPOWER on IntegriCloud