diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-12-03 01:36:22 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-12-03 01:36:22 +0000 |
| commit | 0c6124ba82063b05b9c85b63bb29ec354aa1be0b (patch) | |
| tree | c5cb08e6eb95fe213116ac9bbad149a05d31577a /clang/test/CodeGen | |
| parent | a30cee627201032bc7ea66808d057d97f52b852f (diff) | |
| download | bcm5719-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.c | 4 | ||||
| -rw-r--r-- | clang/test/CodeGen/ubsan-conditional.c | 10 |
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; +} |

