diff options
-rw-r--r-- | clang/Driver/RewriteTest.cpp | 20 | ||||
-rw-r--r-- | clang/test/Sema/rewrite-api-bug.m | 13 |
2 files changed, 26 insertions, 7 deletions
diff --git a/clang/Driver/RewriteTest.cpp b/clang/Driver/RewriteTest.cpp index 23bf240ac82..cc6d56959e2 100644 --- a/clang/Driver/RewriteTest.cpp +++ b/clang/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/clang/test/Sema/rewrite-api-bug.m b/clang/test/Sema/rewrite-api-bug.m new file mode 100644 index 00000000000..35b919c4cea --- /dev/null +++ b/clang/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 + |