diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h index 344f523ed855a2..5e9c07545ae1fb 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -1579,6 +1579,11 @@ inline bool SubPtr(InterpState &S, CodePtr OpPC) { return false; } + if (LHS.isZero() && RHS.isZero()) { + S.Stk.push(); + return true; + } + T A = T::from(LHS.getIndex()); T B = T::from(RHS.getIndex()); return AddSubMulHelper(S, OpPC, A.bitWidth(), A, B); diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp index bc994c3191ce8e..8ea1c1155143e9 100644 --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -1124,3 +1124,10 @@ namespace rdar8769025 { f1(0); // both-warning{{null passed to a callee that requires a non-null argument}} } } + +namespace nullptrsub { + void a() { + char *f = (char *)0; + f = (char *)((char *)0 - (char *)0); + } +}