Index: lib/Sema/SemaExpr.cpp =================================================================== --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -2057,7 +2057,9 @@ } // Give up, we can't recover. - Diag(R.getNameLoc(), diagnostic) << Name; + auto Builder = Diag(R.getNameLoc(), diagnostic) << Name; + if (Name.isIdentifier()) + Builder << SourceRange(R.getNameLoc()); return true; } Index: lib/Sema/SemaType.cpp =================================================================== --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1335,8 +1335,11 @@ // specifiers in each declaration, and in the specifier-qualifier list in // each struct declaration and type name." if (S.getLangOpts().CPlusPlus) { + auto R = DS.getSourceRange(); + if (R.getEnd().isInvalid()) + R.setEnd(R.getBegin()); S.Diag(DeclLoc, diag::err_missing_type_specifier) - << DS.getSourceRange(); + << R; // When this occurs in C++ code, often something is very broken with the // value being declared, poison it as invalid so we don't get chains of