On May 3, 2012, at 6:49 PM, Argyrios Kyrtzidis wrote: > Author: akirtzidis > Date: Thu May 3 20:49:36 2012 > New Revision: 156145 > > URL: http://llvm.org/viewvc/llvm-project?rev=156145&view=rev > Log: > [PCH] Really, pinky swear, fix for PR12689
DenseMap? -Chris > > rdar://11353109 > > Modified: > cfe/trunk/include/clang/Serialization/ASTReader.h > cfe/trunk/lib/Serialization/ASTReader.cpp > cfe/trunk/lib/Serialization/ASTReaderDecl.cpp > cfe/trunk/test/PCH/objc_methods.h > > Modified: cfe/trunk/include/clang/Serialization/ASTReader.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=156145&r1=156144&r2=156145&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Serialization/ASTReader.h (original) > +++ cfe/trunk/include/clang/Serialization/ASTReader.h Thu May 3 20:49:36 2012 > @@ -597,6 +597,8 @@ > /// switch statement can refer to them. > std::map<unsigned, SwitchCase *> SwitchCaseStmts; > > + std::map<unsigned, SwitchCase *> *CurrSwitchCaseStmts; > + > /// \brief The number of stat() calls that hit/missed the stat > /// cache. > unsigned NumStatHits, NumStatMisses; > > Modified: cfe/trunk/lib/Serialization/ASTReader.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=156145&r1=156144&r2=156145&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReader.cpp Thu May 3 20:49:36 2012 > @@ -6248,18 +6248,19 @@ > /// \brief Record that the given ID maps to the given switch-case > /// statement. > void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { > - assert(SwitchCaseStmts[ID] == 0 && "Already have a SwitchCase with this > ID"); > - SwitchCaseStmts[ID] = SC; > + assert((*CurrSwitchCaseStmts)[ID] == 0 && > + "Already have a SwitchCase with this ID"); > + (*CurrSwitchCaseStmts)[ID] = SC; > } > > /// \brief Retrieve the switch-case statement with the given ID. > SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { > - assert(SwitchCaseStmts[ID] != 0 && "No SwitchCase with this ID"); > - return SwitchCaseStmts[ID]; > + assert((*CurrSwitchCaseStmts)[ID] != 0 && "No SwitchCase with this ID"); > + return (*CurrSwitchCaseStmts)[ID]; > } > > void ASTReader::ClearSwitchCaseIDs() { > - SwitchCaseStmts.clear(); > + CurrSwitchCaseStmts->clear(); > } > > void ASTReader::finishPendingActions() { > @@ -6374,7 +6375,8 @@ > DisableValidation(DisableValidation), > DisableStatCache(DisableStatCache), > AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), > - CurrentGeneration(0), NumStatHits(0), NumStatMisses(0), > + CurrentGeneration(0), CurrSwitchCaseStmts(&SwitchCaseStmts), > + NumStatHits(0), NumStatMisses(0), > NumSLocEntriesRead(0), TotalNumSLocEntries(0), > NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0), > TotalNumMacros(0), NumSelectorsRead(0), NumMethodPoolEntriesRead(0), > > Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=156145&r1=156144&r2=156145&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu May 3 20:49:36 2012 > @@ -25,6 +25,7 @@ > #include "clang/AST/DeclCXX.h" > #include "clang/AST/DeclTemplate.h" > #include "clang/AST/Expr.h" > +#include "llvm/Support/SaveAndRestore.h" > using namespace clang; > using namespace clang::serialization; > > @@ -629,8 +630,10 @@ > if (Record[Idx++]) { > // In practice, this won't be executed (since method definitions > // don't occur in header files). > - // Switch case IDs are per method body. > - Reader.ClearSwitchCaseIDs(); > + // Switch case IDs for this method body. > + std::map<unsigned, SwitchCase *> SwitchCaseStmtsForObjCMethod; > + SaveAndRestore<std::map<unsigned, SwitchCase *> *> > + SCFOM(Reader.CurrSwitchCaseStmts, &SwitchCaseStmtsForObjCMethod); > MD->setBody(Reader.ReadStmt(F)); > MD->setSelfDecl(ReadDeclAs<ImplicitParamDecl>(Record, Idx)); > MD->setCmdDecl(ReadDeclAs<ImplicitParamDecl>(Record, Idx)); > > Modified: cfe/trunk/test/PCH/objc_methods.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/objc_methods.h?rev=156145&r1=156144&r2=156145&view=diff > ============================================================================== > --- cfe/trunk/test/PCH/objc_methods.h (original) > +++ cfe/trunk/test/PCH/objc_methods.h Thu May 3 20:49:36 2012 > @@ -25,3 +25,17 @@ > } > } > @end > + > +@interface PR12689_2 > +@end > + > +@implementation PR12689_2 > +-(void)mugi:(int)x { > + switch(x) { > + case 23: [self bonk:x]; break; > + case 82: break; > + } > +} > +-(void)bonk:(int)x { > +} > +@end > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
