Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -10720,7 +10720,15 @@ LHS.get(), RHS.get())) return QualType(); - // FIXME: Add warnings for nullptr - ptr. + // Subtracting from a null pointer should produce a warning. + if (LHS.get()->IgnoreParenCasts()->isNullPointerConstant( + Context, Expr::NPC_ValueDependentIsNotNull)) + diagnoseArithmeticOnNullPointer(*this, Loc, LHS.get(), false); + + // Subtracting a null pointer should produce a warning. + if (RHS.get()->IgnoreParenCasts()->isNullPointerConstant( + Context, Expr::NPC_ValueDependentIsNotNull)) + diagnoseArithmeticOnNullPointer(*this, Loc, RHS.get(), false); // The pointee type may have zero size. As an extension, a structure or // union may have zero size or an array may have zero length. In this Index: clang/test/Sema/pointer-addition.c =================================================================== --- clang/test/Sema/pointer-addition.c +++ clang/test/Sema/pointer-addition.c @@ -29,4 +29,6 @@ // Cases that don't match the GNU inttoptr idiom get a different warning. f = (char*)0 - i; // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}} int *g = (int*)0 + i; // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}} + f = (char*)((char*)0 - f); // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}} + f = (char*)(f - (char*)0); // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior}} }