summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Expr.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-12-08 03:21:47 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-12-08 03:21:47 +0000
commitce8eca578d6956885b46f1fb85173b1296f33dba (patch)
treeb176ae78da1ddec35cbf2d599b414897adec09b0 /clang/lib/AST/Expr.cpp
parent0ebc8605ad74082c1b01b8500782ca220d3eb0df (diff)
downloadbcm5719-llvm-ce8eca578d6956885b46f1fb85173b1296f33dba.tar.gz
bcm5719-llvm-ce8eca578d6956885b46f1fb85173b1296f33dba.zip
Explicitly permit undefined behavior in constant initializers for global
variables in C, in the cases where we can constant-fold it to a value regardless (such as floating-point division by zero and signed integer overflow). Strictly enforcing this rule breaks too much code. llvm-svn: 254992
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
-rw-r--r--clang/lib/AST/Expr.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 33ea76ea74a..9996546a176 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -2891,7 +2891,10 @@ bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef,
return cast<CXXDefaultInitExpr>(this)->getExpr()
->isConstantInitializer(Ctx, false, Culprit);
}
- if (isEvaluatable(Ctx))
+ // Allow certain forms of UB in constant initializers: signed integer
+ // overflow and floating-point division by zero. We'll give a warning on
+ // these, but they're common enough that we have to accept them.
+ if (isEvaluatable(Ctx, SE_AllowUndefinedBehavior))
return true;
if (Culprit)
*Culprit = this;
OpenPOWER on IntegriCloud