[cfe-commits] r156145 - in /cfe/trunk: include/clang/Serialization/ASTReader.h lib/Serialization/ASTReader.cpp lib/Serialization/ASTReaderDecl.cpp test/PCH/objc_methods.h
Argyrios Kyrtzidis
akyrtzi at gmail.com
Thu May 3 18:49:36 PDT 2012
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
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
+
+ at interface PR12689_2
+ at end
+
+ at implementation PR12689_2
+-(void)mugi:(int)x {
+ switch(x) {
+ case 23: [self bonk:x]; break;
+ case 82: break;
+ }
+}
+-(void)bonk:(int)x {
+}
+ at end
More information about the cfe-commits
mailing list