Index: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -723,6 +723,8 @@ } else if (Optional PIP = P.getAs()) { return PathDiagnosticLocation(PIP->getInitializer()->getSourceLocation(), SMng); + } else if (Optional PIC = P.getAs()) { + return PathDiagnosticLocation(PIC->getLocation(), SMng); } else if (Optional PIE = P.getAs()) { return PathDiagnosticLocation(PIE->getLocation(), SMng); } else if (Optional CE = P.getAs()) { Index: cfe/trunk/test/Analysis/diagnostics/dtors.cpp =================================================================== --- cfe/trunk/test/Analysis/diagnostics/dtors.cpp +++ cfe/trunk/test/Analysis/diagnostics/dtors.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_analyze_cc1 -w -analyzer-checker=core,cplusplus -verify %s + +// expected-no-diagnostics + +namespace no_crash_on_delete_dtor { +// We were crashing when producing diagnostics for this code. +struct S { + void foo(); + ~S(); +}; + +struct smart_ptr { + int x; + S *s; + smart_ptr(S *); + S *get() { + return (x || 0) ? nullptr : s; + } +}; + +void bar(smart_ptr p) { + delete p.get(); + p.get()->foo(); +} +} // namespace no_crash_on_delete_dtor