diff options
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/Sema.h | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 12 |
2 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 57caa6ecf24..044bfbd73be 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -736,6 +736,9 @@ public: ExprTy *expr, TypeTy *type, SourceLocation RPLoc); + // __null + virtual ExprResult ActOnGNUNullExpr(SourceLocation TokenLoc); + //===------------------------- "Block" Extension ------------------------===// /// ActOnBlockStart - This callback is invoked when a block literal is diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index e21047e10d8..fb964692b35 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3603,6 +3603,18 @@ Sema::ExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc, return new VAArgExpr(BuiltinLoc, E, T.getNonReferenceType(), RPLoc); } +Sema::ExprResult Sema::ActOnGNUNullExpr(SourceLocation TokenLoc) { + // The type of __null will be int or long, depending on the size of + // pointers on the target. + QualType Ty; + if (Context.Target.getPointerWidth(0) == Context.Target.getIntWidth()) + Ty = Context.IntTy; + else + Ty = Context.LongTy; + + return new GNUNullExpr(Ty, TokenLoc); +} + bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, |