Index: lib/AST/ExprConstant.cpp =================================================================== --- lib/AST/ExprConstant.cpp +++ lib/AST/ExprConstant.cpp @@ -2169,6 +2169,9 @@ if (!Base->isVirtual()) return HandleLValueDirectBase(Info, E, Obj, DerivedDecl, BaseDecl); + if (!Obj.checkNullPointer(Info, E, CSK_Base)) + return false; + SubobjectDesignator &D = Obj.Designator; if (D.Invalid) return false; @@ -9913,8 +9916,11 @@ if (E->getType().isNull()) return false; - if (!CheckLiteralType(Info, E)) + if (!CheckLiteralType(Info, E)) { + if (Info.noteFailure()) + EvaluateIgnoredValue(Info, E); return false; + } if (!::Evaluate(Result, Info, E)) return false; Index: test/Sema/integer-overflow.c =================================================================== --- test/Sema/integer-overflow.c +++ test/Sema/integer-overflow.c @@ -149,16 +149,16 @@ // expected-warning@+2 {{overflow in expression; result is 536870912 with type 'int'}} uint64_t *b; - uint64_t b2 = b[4608 * 1024 * 1024] + 1; + (void)b[4608 * 1024 * 1024]; // expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} - int j1 = i ? (4608 * 1024 * 1024) : (4608 * 1024 * 1024); + (void)(i ? (4608 * 1024 * 1024) : (4608 * 1024 * 1024)); // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} - int j2 = -(4608 * 1024 * 1024); + (void)(-(4608 * 1024 * 1024)); // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} - uint64_t j3 = b[4608 * 1024 * 1024]; + (void)b[4608 * 1024 * 1024]; // expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} return ((4608 * 1024 * 1024) + ((uint64_t)(4608 * 1024 * 1024)));