diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3e8bd63e89ae..6627aaf3e6d8 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -10845,8 +10845,10 @@ static void diagnoseSubtractionOnNullPointer(Sema &S, SourceLocation Loc, if (S.Diags.getSuppressSystemWarnings() && S.SourceMgr.isInSystemMacro(Loc)) return; - S.Diag(Loc, diag::warn_pointer_sub_null_ptr) - << S.getLangOpts().CPlusPlus << Pointer->getSourceRange(); + S.DiagRuntimeBehavior(Loc, Pointer, + S.PDiag(diag::warn_pointer_sub_null_ptr) + << S.getLangOpts().CPlusPlus + << Pointer->getSourceRange()); } /// Diagnose invalid arithmetic on two function pointers. diff --git a/clang/test/Sema/pointer-subtraction.c b/clang/test/Sema/pointer-subtraction.c index c3dbbd47459f..79d18a0f0a30 100644 --- a/clang/test/Sema/pointer-subtraction.c +++ b/clang/test/Sema/pointer-subtraction.c @@ -11,6 +11,16 @@ void a(void) { f = (char *)(f - (char *)0); // expected-warning {{performing pointer subtraction with a null pointer has undefined behavior}} f = (char *)((char *)0 - (char *)0); // expected-warning {{performing pointer subtraction with a null pointer has undefined behavior}} expected-warning {{performing pointer subtraction with a null pointer has undefined behavior}} + if (1) + f = (char *)((char *)0 - f); // expected-warning {{performing pointer subtraction with a null pointer has undefined behavior}} + else + f = (char *)((char *)0 - f); + + if (0) + f = (char *)((char *)0 - f); + else + f = (char *)((char *)0 - f); // expected-warning {{performing pointer subtraction with a null pointer has undefined behavior}} + #ifndef SYSTEM_WARNINGS SYSTEM_MACRO(f); #else diff --git a/clang/test/Sema/pointer-subtraction.cpp b/clang/test/Sema/pointer-subtraction.cpp index efbb3255e5d3..28063a1fea6e 100644 --- a/clang/test/Sema/pointer-subtraction.cpp +++ b/clang/test/Sema/pointer-subtraction.cpp @@ -11,6 +11,16 @@ void a() { f = (char *)(f - (char *)0); // expected-warning {{performing pointer subtraction with a null pointer may have undefined behavior}} f = (char *)((char *)0 - (char *)0); // valid in C++ + if (1) + f = (char *)((char *)0 - f); // expected-warning {{performing pointer subtraction with a null pointer may have undefined behavior}} + else + f = (char *)((char *)0 - f); + + if (0) + f = (char *)((char *)0 - f); + else + f = (char *)((char *)0 - f); // expected-warning {{performing pointer subtraction with a null pointer may have undefined behavior}} + #ifndef SYSTEM_WARNINGS SYSTEM_MACRO(f); #else