blob: 5314dacd6108f2ef10bee55b375c22d70bdb3a6c [file] [log] [blame]
Ted Kremenek215c2c82007-10-31 18:41:19 +00001//===--- StmtSerialization.cpp - Serialization of Statements --------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Ted Kremenek and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the type-specific methods for serializing statements
11// and expressions.
12//
13//===----------------------------------------------------------------------===//
14
Ted Kremenek47281102007-11-07 00:17:35 +000015#include "clang/AST/Expr.h"
Ted Kremenek215c2c82007-10-31 18:41:19 +000016#include "llvm/Bitcode/Serialize.h"
17#include "llvm/Bitcode/Deserialize.h"
18
Ted Kremenek215c2c82007-10-31 18:41:19 +000019using namespace clang;
20
Ted Kremenek47281102007-11-07 00:17:35 +000021void Stmt::Emit(llvm::Serializer& S) const {
Ted Kremenekb9b543d2007-11-07 22:32:23 +000022 S.FlushRecord();
Ted Kremenek47281102007-11-07 00:17:35 +000023 S.EmitInt(getStmtClass());
24 directEmit(S);
25}
Ted Kremenek215c2c82007-10-31 18:41:19 +000026
Ted Kremenek47281102007-11-07 00:17:35 +000027Stmt* Stmt::Materialize(llvm::Deserializer& D) {
28 StmtClass SC = static_cast<StmtClass>(D.ReadInt());
Ted Kremenek215c2c82007-10-31 18:41:19 +000029
Ted Kremenek47281102007-11-07 00:17:35 +000030 switch (SC) {
31 default:
32 assert (false && "Not implemented.");
33 return NULL;
Ted Kremenek2bd6e652007-11-07 00:37:40 +000034
35 case BinaryOperatorClass:
36 return BinaryOperator::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +000037
Ted Kremenek249d7cd2007-11-07 05:25:31 +000038 case BreakStmtClass:
39 return BreakStmt::directMaterialize(D);
40
41 case CaseStmtClass:
42 return CaseStmt::directMaterialize(D);
43
Ted Kremenek42f440c2007-11-07 17:15:49 +000044 case CharacterLiteralClass:
45 return CharacterLiteral::directMaterialize(D);
46
Ted Kremenek47281102007-11-07 00:17:35 +000047 case CompoundStmtClass:
48 return CompoundStmt::directMaterialize(D);
49
Ted Kremenek6c4dba72007-11-07 17:05:07 +000050 case ContinueStmtClass:
51 return ContinueStmt::directMaterialize(D);
52
Ted Kremenek47281102007-11-07 00:17:35 +000053 case DeclRefExprClass:
54 return DeclRefExpr::directMaterialize(D);
55
Ted Kremenek2bd6e652007-11-07 00:37:40 +000056 case DeclStmtClass:
57 return DeclStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000058
59 case DefaultStmtClass:
60 return DefaultStmt::directMaterialize(D);
Ted Kremenekab97f4d2007-11-07 07:53:55 +000061
62 case DoStmtClass:
63 return DoStmt::directMaterialize(D);
Ted Kremenek18abf6b2007-11-07 18:45:55 +000064
65 case FloatingLiteralClass:
66 return FloatingLiteral::directMaterialize(D);
Ted Kremenekf34da902007-11-07 08:02:55 +000067
68 case ForStmtClass:
69 return ForStmt::directMaterialize(D);
Ted Kremenekaffd8be2007-11-07 08:07:46 +000070
71 case GotoStmtClass:
72 return GotoStmt::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +000073
Ted Kremenekca22d352007-11-07 07:19:30 +000074 case IfStmtClass:
75 return IfStmt::directMaterialize(D);
Ted Kremenek105f21a2007-11-07 18:53:02 +000076
77 case ImaginaryLiteralClass:
78 return ImaginaryLiteral::directMaterialize(D);
Ted Kremenekca22d352007-11-07 07:19:30 +000079
Ted Kremeneke7d27d52007-11-07 17:02:32 +000080 case IndirectGotoStmtClass:
81 return IndirectGotoStmt::directMaterialize(D);
82
Ted Kremenek47281102007-11-07 00:17:35 +000083 case IntegerLiteralClass:
Ted Kremenek25aaa262007-11-07 00:40:53 +000084 return IntegerLiteral::directMaterialize(D);
85
Ted Kremenek56a74bb2007-11-07 00:48:04 +000086 case LabelStmtClass:
87 return LabelStmt::directMaterialize(D);
88
Ted Kremenek25aaa262007-11-07 00:40:53 +000089 case NullStmtClass:
90 return NullStmt::directMaterialize(D);
Ted Kremenek2bd6e652007-11-07 00:37:40 +000091
Ted Kremenek249d7cd2007-11-07 05:25:31 +000092 case ParenExprClass:
93 return ParenExpr::directMaterialize(D);
94
Ted Kremenek539a4182007-11-07 17:11:58 +000095 case PreDefinedExprClass:
96 return PreDefinedExpr::directMaterialize(D);
97
Ted Kremenek2bd6e652007-11-07 00:37:40 +000098 case ReturnStmtClass:
Ted Kremenek249d7cd2007-11-07 05:25:31 +000099 return ReturnStmt::directMaterialize(D);
Ted Kremenekefa540d2007-11-07 19:08:19 +0000100
101 case StringLiteralClass:
102 return StringLiteral::directMaterialize(D);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000103
104 case SwitchStmtClass:
105 return SwitchStmt::directMaterialize(D);
Ted Kremenek55e559a2007-11-07 07:50:10 +0000106
107 case WhileStmtClass:
108 return WhileStmt::directMaterialize(D);
Ted Kremenek47281102007-11-07 00:17:35 +0000109 }
Ted Kremenek215c2c82007-10-31 18:41:19 +0000110}
111
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000112void BinaryOperator::directEmit(llvm::Serializer& S) const {
113 S.EmitInt(Opc);
114 S.Emit(OpLoc);;
115 S.Emit(getType());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000116 S.BatchEmitOwnedPtrs(getLHS(),getRHS());
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000117}
118
119BinaryOperator* BinaryOperator::directMaterialize(llvm::Deserializer& D) {
120 Opcode Opc = static_cast<Opcode>(D.ReadInt());
121 SourceLocation OpLoc = SourceLocation::ReadVal(D);
122 QualType Result = QualType::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000123 Expr *LHS, *RHS;
124 D.BatchReadOwnedPtrs(LHS,RHS);
125
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000126 return new BinaryOperator(LHS,RHS,Opc,Result,OpLoc);
127}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000128
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000129void BreakStmt::directEmit(llvm::Serializer& S) const {
130 S.Emit(BreakLoc);
131}
132
133BreakStmt* BreakStmt::directMaterialize(llvm::Deserializer& D) {
134 SourceLocation Loc = SourceLocation::ReadVal(D);
135 return new BreakStmt(Loc);
136}
137
138void CaseStmt::directEmit(llvm::Serializer& S) const {
139 S.Emit(CaseLoc);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000140 S.EmitPtr(getNextSwitchCase());
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000141 S.BatchEmitOwnedPtrs(getLHS(),getRHS(),getSubStmt());
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000142}
143
144CaseStmt* CaseStmt::directMaterialize(llvm::Deserializer& D) {
145 SourceLocation CaseLoc = SourceLocation::ReadVal(D);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000146 Expr *LHS, *RHS;
147 Stmt* SubStmt;
148 D.BatchReadOwnedPtrs(LHS,RHS,SubStmt);
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000149
150 CaseStmt* stmt = new CaseStmt(LHS,RHS,SubStmt,CaseLoc);
Ted Kremenekb9b543d2007-11-07 22:32:23 +0000151 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000152 return stmt;
153}
Ted Kremenek215c2c82007-10-31 18:41:19 +0000154
Ted Kremenek42f440c2007-11-07 17:15:49 +0000155void CharacterLiteral::directEmit(llvm::Serializer& S) const {
156 S.Emit(Value);
157 S.Emit(Loc);
158 S.Emit(getType());
159}
160
161CharacterLiteral* CharacterLiteral::directMaterialize(llvm::Deserializer& D) {
162 unsigned value = D.ReadInt();
163 SourceLocation Loc = SourceLocation::ReadVal(D);
164 QualType T = QualType::ReadVal(D);
165 return new CharacterLiteral(value,T,Loc);
166}
167
Ted Kremenek47281102007-11-07 00:17:35 +0000168void CompoundStmt::directEmit(llvm::Serializer& S) const {
169 S.Emit(LBracLoc);
170 S.Emit(RBracLoc);
171 S.Emit(Body.size());
Ted Kremenek215c2c82007-10-31 18:41:19 +0000172
Ted Kremenek47281102007-11-07 00:17:35 +0000173 for (const_body_iterator I=body_begin(), E=body_end(); I!=E; ++I)
Ted Kremenek215c2c82007-10-31 18:41:19 +0000174 S.EmitOwnedPtr(*I);
175}
176
Ted Kremenek47281102007-11-07 00:17:35 +0000177CompoundStmt* CompoundStmt::directMaterialize(llvm::Deserializer& D) {
178 SourceLocation LB = SourceLocation::ReadVal(D);
179 SourceLocation RB = SourceLocation::ReadVal(D);
180 unsigned size = D.ReadInt();
Ted Kremenek215c2c82007-10-31 18:41:19 +0000181
Ted Kremenek47281102007-11-07 00:17:35 +0000182 CompoundStmt* stmt = new CompoundStmt(NULL,0,LB,RB);
183
184 stmt->Body.reserve(size);
185
186 for (unsigned i = 0; i < size; ++i)
187 stmt->Body.push_back(D.ReadOwnedPtr<Stmt>());
188
189 return stmt;
Ted Kremenek215c2c82007-10-31 18:41:19 +0000190}
Ted Kremenek47281102007-11-07 00:17:35 +0000191
Ted Kremenek6c4dba72007-11-07 17:05:07 +0000192void ContinueStmt::directEmit(llvm::Serializer& S) const {
193 S.Emit(ContinueLoc);
194}
195
196ContinueStmt* ContinueStmt::directMaterialize(llvm::Deserializer& D) {
197 SourceLocation Loc = SourceLocation::ReadVal(D);
198 return new ContinueStmt(Loc);
199}
200
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000201void DeclStmt::directEmit(llvm::Serializer& S) const {
202 // FIXME: special handling for struct decls.
203 S.EmitOwnedPtr(getDecl());
Ted Kremenek47281102007-11-07 00:17:35 +0000204}
205
206void DeclRefExpr::directEmit(llvm::Serializer& S) const {
207 S.Emit(Loc);
208 S.Emit(getType());
209 S.EmitPtr(getDecl());
210}
211
212DeclRefExpr* DeclRefExpr::directMaterialize(llvm::Deserializer& D) {
213 SourceLocation Loc = SourceLocation::ReadVal(D);
214 QualType T = QualType::ReadVal(D);
215 DeclRefExpr* dr = new DeclRefExpr(NULL,T,Loc);
216 D.ReadPtr(dr->D,false);
217 return dr;
218}
219
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000220DeclStmt* DeclStmt::directMaterialize(llvm::Deserializer& D) {
221 ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
222 return new DeclStmt(decl);
223}
224
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000225void DefaultStmt::directEmit(llvm::Serializer& S) const {
226 S.Emit(DefaultLoc);
227 S.EmitOwnedPtr(getSubStmt());
228 S.EmitPtr(getNextSwitchCase());
229}
230
231DefaultStmt* DefaultStmt::directMaterialize(llvm::Deserializer& D) {
232 SourceLocation Loc = SourceLocation::ReadVal(D);
233 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
234
235 DefaultStmt* stmt = new DefaultStmt(Loc,SubStmt);
236 stmt->setNextSwitchCase(D.ReadPtr<SwitchCase>());
237
238 return stmt;
239}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000240
Ted Kremenekab97f4d2007-11-07 07:53:55 +0000241void DoStmt::directEmit(llvm::Serializer& S) const {
242 S.Emit(DoLoc);
243 S.EmitOwnedPtr(getCond());
244 S.EmitOwnedPtr(getBody());
245}
246
247DoStmt* DoStmt::directMaterialize(llvm::Deserializer& D) {
248 SourceLocation DoLoc = SourceLocation::ReadVal(D);
249 Expr* Cond = D.ReadOwnedPtr<Expr>();
250 Stmt* Body = D.ReadOwnedPtr<Stmt>();
251 return new DoStmt(Body,Cond,DoLoc);
252}
253
Ted Kremenek18abf6b2007-11-07 18:45:55 +0000254void FloatingLiteral::directEmit(llvm::Serializer& S) const {
255 S.Emit(Loc);
256 S.Emit(getType());
257 S.Emit(Value);
258}
259
260FloatingLiteral* FloatingLiteral::directMaterialize(llvm::Deserializer& D) {
261 SourceLocation Loc = SourceLocation::ReadVal(D);
262 QualType t = QualType::ReadVal(D);
263 llvm::APFloat Val = llvm::APFloat::ReadVal(D);
264 FloatingLiteral* expr = new FloatingLiteral(Val,t,Loc);
265 return expr;
266}
267
Ted Kremenekf34da902007-11-07 08:02:55 +0000268void ForStmt::directEmit(llvm::Serializer& S) const {
269 S.Emit(ForLoc);
270 S.EmitOwnedPtr(getInit());
271 S.EmitOwnedPtr(getCond());
272 S.EmitOwnedPtr(getInc());
273 S.EmitOwnedPtr(getBody());
274}
275
276ForStmt* ForStmt::directMaterialize(llvm::Deserializer& D) {
277 SourceLocation ForLoc = SourceLocation::ReadVal(D);
278 Stmt* Init = D.ReadOwnedPtr<Stmt>();
279 Expr* Cond = D.ReadOwnedPtr<Expr>();
280 Expr* Inc = D.ReadOwnedPtr<Expr>();
281 Stmt* Body = D.ReadOwnedPtr<Stmt>();
282 return new ForStmt(Init,Cond,Inc,Body,ForLoc);
283}
284
Ted Kremenekaffd8be2007-11-07 08:07:46 +0000285void GotoStmt::directEmit(llvm::Serializer& S) const {
286 S.Emit(GotoLoc);
287 S.Emit(LabelLoc);
288 S.EmitPtr(Label);
289}
290
291GotoStmt* GotoStmt::directMaterialize(llvm::Deserializer& D) {
292 SourceLocation GotoLoc = SourceLocation::ReadVal(D);
293 SourceLocation LabelLoc = SourceLocation::ReadVal(D);
294 GotoStmt* stmt = new GotoStmt(NULL,GotoLoc,LabelLoc);
295 D.ReadPtr(stmt->Label); // This pointer may be backpatched later.
296 return stmt;
297}
298
Ted Kremenekca22d352007-11-07 07:19:30 +0000299void IfStmt::directEmit(llvm::Serializer& S) const {
300 S.Emit(IfLoc);
301 S.EmitOwnedPtr(getCond());
302 S.EmitOwnedPtr(getThen());
303 S.EmitOwnedPtr(getElse());
304}
305
306IfStmt* IfStmt::directMaterialize(llvm::Deserializer& D) {
307 SourceLocation L = SourceLocation::ReadVal(D);
308 Expr* Cond = D.ReadOwnedPtr<Expr>();
309 Stmt* Then = D.ReadOwnedPtr<Stmt>();
310 Stmt* Else = D.ReadOwnedPtr<Stmt>();
311 return new IfStmt(L,Cond,Then,Else);
312}
313
Ted Kremenek105f21a2007-11-07 18:53:02 +0000314void ImaginaryLiteral::directEmit(llvm::Serializer& S) const {
315 S.Emit(getType());
316 S.EmitOwnedPtr(Val);
317}
318
319ImaginaryLiteral* ImaginaryLiteral::directMaterialize(llvm::Deserializer& D) {
320 QualType t = QualType::ReadVal(D);
321 Expr* expr = D.ReadOwnedPtr<Expr>();
322 assert (isa<FloatingLiteral>(expr) || isa<IntegerLiteral>(expr));
323 return new ImaginaryLiteral(expr,t);
324}
325
Ted Kremeneke7d27d52007-11-07 17:02:32 +0000326void IndirectGotoStmt::directEmit(llvm::Serializer& S) const {
327 S.EmitPtr(Target);
328}
329
330IndirectGotoStmt* IndirectGotoStmt::directMaterialize(llvm::Deserializer& D) {
331 IndirectGotoStmt* stmt = new IndirectGotoStmt(NULL);
332 D.ReadPtr(stmt->Target); // The target may be backpatched.
333 return stmt;
334}
335
Ted Kremenek47281102007-11-07 00:17:35 +0000336void IntegerLiteral::directEmit(llvm::Serializer& S) const {
337 S.Emit(Loc);
338 S.Emit(getType());
339 S.Emit(getValue());
340}
341
342IntegerLiteral* IntegerLiteral::directMaterialize(llvm::Deserializer& D) {
343 SourceLocation Loc = SourceLocation::ReadVal(D);
344 QualType T = QualType::ReadVal(D);
345
346 // Create a dummy APInt because it is more efficient to deserialize
347 // it in place with the deserialized IntegerLiteral. (fewer copies)
348 llvm::APInt temp;
349 IntegerLiteral* expr = new IntegerLiteral(temp,T,Loc);
350 D.Read(expr->Value);
351
352 return expr;
353}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000354
Ted Kremenek56a74bb2007-11-07 00:48:04 +0000355void LabelStmt::directEmit(llvm::Serializer& S) const {
356 S.EmitPtr(Label);
357 S.Emit(IdentLoc);
358 S.EmitOwnedPtr(SubStmt);
359}
360
361LabelStmt* LabelStmt::directMaterialize(llvm::Deserializer& D) {
362 IdentifierInfo* Label = D.ReadPtr<IdentifierInfo>();
363 SourceLocation IdentLoc = SourceLocation::ReadVal(D);
364 Stmt* SubStmt = D.ReadOwnedPtr<Stmt>();
365 return new LabelStmt(IdentLoc,Label,SubStmt);
366}
367
Ted Kremenek25aaa262007-11-07 00:40:53 +0000368void NullStmt::directEmit(llvm::Serializer& S) const {
369 S.Emit(SemiLoc);
370}
371
372NullStmt* NullStmt::directMaterialize(llvm::Deserializer& D) {
373 SourceLocation SemiLoc = SourceLocation::ReadVal(D);
374 return new NullStmt(SemiLoc);
375}
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000376
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000377void ParenExpr::directEmit(llvm::Serializer& S) const {
378 S.Emit(L);
379 S.Emit(R);
380 S.EmitOwnedPtr(Val);
381}
382
383ParenExpr* ParenExpr::directMaterialize(llvm::Deserializer& D) {
384 SourceLocation L = SourceLocation::ReadVal(D);
385 SourceLocation R = SourceLocation::ReadVal(D);
386 Expr* val = D.ReadOwnedPtr<Expr>();
387 return new ParenExpr(L,R,val);
Ted Kremenek539a4182007-11-07 17:11:58 +0000388}
389
390void PreDefinedExpr::directEmit(llvm::Serializer& S) const {
391 S.Emit(Loc);
392 S.EmitInt(getIdentType());
393 S.Emit(getType());
394}
395
396PreDefinedExpr* PreDefinedExpr::directMaterialize(llvm::Deserializer& D) {
397 SourceLocation Loc = SourceLocation::ReadVal(D);
398 IdentType it = static_cast<IdentType>(D.ReadInt());
399 QualType Q = QualType::ReadVal(D);
400 return new PreDefinedExpr(Loc,Q,it);
401}
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000402
Ted Kremenek2bd6e652007-11-07 00:37:40 +0000403void ReturnStmt::directEmit(llvm::Serializer& S) const {
404 S.Emit(RetLoc);
405 S.EmitOwnedPtr(RetExpr);
406}
407
408ReturnStmt* ReturnStmt::directMaterialize(llvm::Deserializer& D) {
409 SourceLocation RetLoc = SourceLocation::ReadVal(D);
410 Expr* RetExpr = D.ReadOwnedPtr<Expr>();
411 return new ReturnStmt(RetLoc,RetExpr);
412}
413
Ted Kremenekefa540d2007-11-07 19:08:19 +0000414void StringLiteral::directEmit(llvm::Serializer& S) const {
415 S.Emit(getType());
416 S.Emit(firstTokLoc);
417 S.Emit(lastTokLoc);
418 S.EmitBool(isWide());
419 S.Emit(getByteLength());
420
421 for (unsigned i = 0 ; i < ByteLength; ++i)
422 S.EmitInt(StrData[i]);
423}
424
425StringLiteral* StringLiteral::directMaterialize(llvm::Deserializer& D) {
426 QualType t = QualType::ReadVal(D);
427 SourceLocation firstTokLoc = SourceLocation::ReadVal(D);
428 SourceLocation lastTokLoc = SourceLocation::ReadVal(D);
429 bool isWide = D.ReadBool();
430 unsigned ByteLength = D.ReadInt();
431
432 StringLiteral* sl = new StringLiteral(NULL,0,isWide,t,firstTokLoc,lastTokLoc);
433
434 char* StrData = new char[ByteLength];
435 for (unsigned i = 0; i < ByteLength; ++i)
436 StrData[i] = (char) D.ReadInt();
437
438 sl->ByteLength = ByteLength;
439 sl->StrData = StrData;
440
441 return sl;
442}
443
Ted Kremenek249d7cd2007-11-07 05:25:31 +0000444void SwitchStmt::directEmit(llvm::Serializer& S) const {
445 S.Emit(SwitchLoc);
446 S.EmitOwnedPtr(getCond());
447 S.EmitOwnedPtr(getBody());
448 S.EmitPtr(FirstCase);
449}
450
451SwitchStmt* SwitchStmt::directMaterialize(llvm::Deserializer& D) {
452 SourceLocation Loc = SourceLocation::ReadVal(D);
453 Stmt* Cond = D.ReadOwnedPtr<Stmt>();
454 Stmt* Body = D.ReadOwnedPtr<Stmt>();
455 SwitchCase* FirstCase = cast<SwitchCase>(D.ReadPtr<Stmt>());
456
457 SwitchStmt* stmt = new SwitchStmt(cast<Expr>(Cond));
458 stmt->setBody(Body,Loc);
459 stmt->FirstCase = FirstCase;
460
461 return stmt;
462}
Ted Kremenek55e559a2007-11-07 07:50:10 +0000463
464void WhileStmt::directEmit(llvm::Serializer& S) const {
465 S.Emit(WhileLoc);
466 S.EmitOwnedPtr(getCond());
467 S.EmitOwnedPtr(getBody());
468}
469
470WhileStmt* WhileStmt::directMaterialize(llvm::Deserializer& D) {
471 SourceLocation WhileLoc = SourceLocation::ReadVal(D);
472 Expr* Cond = D.ReadOwnedPtr<Expr>();
473 Stmt* Body = D.ReadOwnedPtr<Stmt>();
474 return new WhileStmt(Cond,Body,WhileLoc);
475}