diff options
-rw-r--r-- | Driver/RewriteTest.cpp | 20 | ||||
-rw-r--r-- | test/Sema/rewrite-api-bug.m | 13 |
2 files changed, 26 insertions, 7 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index 23bf240ac8..cc6d56959e 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -1310,20 +1310,26 @@ void RewriteTest::SynthesizeObjcInternalStruct(ObjcInterfaceDecl *CDecl, } int NumIvars = CDecl->getNumInstanceVariables(); + SourceLocation LocStart = CDecl->getLocStart(); + SourceLocation LocEnd = CDecl->getLocEnd(); + + const char *startBuf = SM->getCharacterData(LocStart); + const char *endBuf = SM->getCharacterData(LocEnd); // If no ivars and no root or if its root, directly or indirectly, // have no ivars (thus not synthesized) then no need to synthesize this class. - if (NumIvars <= 0 && (!RCDecl || !ObjcSynthesizedStructs.count(RCDecl))) + if (NumIvars <= 0 && (!RCDecl || !ObjcSynthesizedStructs.count(RCDecl))) { + //FIXME: This does not replace @interface class-name with the + //Result text. Could be a bug in ReplaceText API. + endBuf += Lexer::MeasureTokenLength(LocEnd, *SM); + Rewrite.ReplaceText(LocStart, endBuf-startBuf, + Result.c_str(), Result.size()); return; + } + // FIXME: This has potential of causing problem. If // SynthesizeObjcInternalStruct is ever called recursively. Result += "\nstruct "; Result += CDecl->getName(); - - SourceLocation LocStart = CDecl->getLocStart(); - SourceLocation LocEnd = CDecl->getLocEnd(); - - const char *startBuf = SM->getCharacterData(LocStart); - const char *endBuf = SM->getCharacterData(LocEnd); if (NumIvars > 0) { const char *cursor = strchr(startBuf, '{'); diff --git a/test/Sema/rewrite-api-bug.m b/test/Sema/rewrite-api-bug.m new file mode 100644 index 0000000000..35b919c4ce --- /dev/null +++ b/test/Sema/rewrite-api-bug.m @@ -0,0 +1,13 @@ +// RUN: clang -rewrite-test %s + +#include <Objc/objc.h> + +@interface MyDerived +- (void) instanceMethod; +@end + +@implementation MyDerived +- (void) instanceMethod { +} +@end + |