diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-12-08 03:21:47 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-12-08 03:21:47 +0000 |
commit | ce8eca578d6956885b46f1fb85173b1296f33dba (patch) | |
tree | b176ae78da1ddec35cbf2d599b414897adec09b0 /clang/lib/AST/Expr.cpp | |
parent | 0ebc8605ad74082c1b01b8500782ca220d3eb0df (diff) | |
download | bcm5719-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.cpp | 5 |
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; |