From: Steve Naroff Date: Wed, 19 Nov 2008 21:15:47 +0000 (+0000) Subject: Fix assertion failure: SourceManager.h line 489. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cda658e90d7ffe0ece23d741ff82cf764108f66c;p=clang Fix assertion failure: SourceManager.h line 489. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59664 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/RewriteObjC.cpp b/Driver/RewriteObjC.cpp index 804a891f6b..a3ce8a8c56 100644 --- a/Driver/RewriteObjC.cpp +++ b/Driver/RewriteObjC.cpp @@ -1572,9 +1572,21 @@ bool RewriteObjC::needToScanForQualifiers(QualType T) { void RewriteObjC::RewriteObjCQualifiedInterfaceTypes(Expr *E) { QualType Type = E->getType(); if (needToScanForQualifiers(Type)) { - SourceLocation Loc = E->getLocStart(); + SourceLocation Loc, EndLoc; + + if (const CStyleCastExpr *ECE = dyn_cast(E)) { + Loc = ECE->getLParenLoc(); + EndLoc = ECE->getRParenLoc(); + } else { + Loc = E->getLocStart(); + EndLoc = E->getLocEnd(); + } + // This will defend against trying to rewrite synthesized expressions. + if (Loc.isInvalid() || EndLoc.isInvalid()) + return; + const char *startBuf = SM->getCharacterData(Loc); - const char *endBuf = SM->getCharacterData(E->getLocEnd()); + const char *endBuf = SM->getCharacterData(EndLoc); const char *startRef = 0, *endRef = 0; if (scanForProtocolRefs(startBuf, endBuf, startRef, endRef)) { // Get the locations of the startRef, endRef. diff --git a/test/Rewriter/crash.m b/test/Rewriter/crash.m index 59f18f37c2..2e34850e96 100644 --- a/test/Rewriter/crash.m +++ b/test/Rewriter/crash.m @@ -12,3 +12,14 @@ int main() { return 0; } +// rdar://6291588 +@protocol A +@end + +@interface Foo +@end + +void func() { + id obj = (id )[Foo bar]; +} +