diff options
| author | Abramo Bagnara <abramo.bagnara@gmail.com> | 2010-08-10 08:50:03 +0000 |
|---|---|---|
| committer | Abramo Bagnara <abramo.bagnara@gmail.com> | 2010-08-10 08:50:03 +0000 |
| commit | 092990ac68670d39e99bcb91e22107699f63aa78 (patch) | |
| tree | 34246451d46ed27da3b6d2120907c69568e2d339 /clang/lib/Sema | |
| parent | e03edfd3e7d883bb671fb3cd5ca94ffb470e5cfa (diff) | |
| download | bcm5719-llvm-092990ac68670d39e99bcb91e22107699f63aa78.tar.gz bcm5719-llvm-092990ac68670d39e99bcb91e22107699f63aa78.zip | |
Added TypeLocs to TypesCompatibleExpr node.
llvm-svn: 110663
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/Sema.h | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 18 | ||||
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 26 |
3 files changed, 32 insertions, 16 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 1e5da3d3399..74d0f2afad6 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -2154,6 +2154,10 @@ public: virtual OwningExprResult ActOnTypesCompatibleExpr(SourceLocation BuiltinLoc, TypeTy *arg1, TypeTy *arg2, SourceLocation RPLoc); + OwningExprResult BuildTypesCompatibleExpr(SourceLocation BuiltinLoc, + TypeSourceInfo *argTInfo1, + TypeSourceInfo *argTInfo2, + SourceLocation RPLoc); // __builtin_choose_expr(constExpr, expr1, expr2) virtual OwningExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index d573ca9bbbd..e5a50656874 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -7019,12 +7019,21 @@ Sema::OwningExprResult Sema::ActOnBuiltinOffsetOf(Scope *S, Sema::OwningExprResult Sema::ActOnTypesCompatibleExpr(SourceLocation BuiltinLoc, TypeTy *arg1,TypeTy *arg2, SourceLocation RPLoc) { - // FIXME: Preserve type source info. - QualType argT1 = GetTypeFromParser(arg1); - QualType argT2 = GetTypeFromParser(arg2); + TypeSourceInfo *argTInfo1; + QualType argT1 = GetTypeFromParser(arg1, &argTInfo1); + TypeSourceInfo *argTInfo2; + QualType argT2 = GetTypeFromParser(arg2, &argTInfo2); assert((!argT1.isNull() && !argT2.isNull()) && "Missing type argument(s)"); + return BuildTypesCompatibleExpr(BuiltinLoc, argTInfo1, argTInfo2, RPLoc); +} + +Sema::OwningExprResult +Sema::BuildTypesCompatibleExpr(SourceLocation BuiltinLoc, + TypeSourceInfo *argTInfo1, + TypeSourceInfo *argTInfo2, + SourceLocation RPLoc) { if (getLangOptions().CPlusPlus) { Diag(BuiltinLoc, diag::err_types_compatible_p_in_cplusplus) << SourceRange(BuiltinLoc, RPLoc); @@ -7032,9 +7041,10 @@ Sema::OwningExprResult Sema::ActOnTypesCompatibleExpr(SourceLocation BuiltinLoc, } return Owned(new (Context) TypesCompatibleExpr(Context.IntTy, BuiltinLoc, - argT1, argT2, RPLoc)); + argTInfo1, argTInfo2, RPLoc)); } + Sema::OwningExprResult Sema::ActOnChooseExpr(SourceLocation BuiltinLoc, ExprArg cond, ExprArg expr1, ExprArg expr2, diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index d13219dbcf5..65107ccfe79 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -1354,11 +1354,11 @@ public: /// By default, performs semantic analysis to build the new expression. /// Subclasses may override this routine to provide different behavior. OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, - QualType T1, QualType T2, + TypeSourceInfo *TInfo1, + TypeSourceInfo *TInfo2, SourceLocation RParenLoc) { - return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, - T1.getAsOpaquePtr(), - T2.getAsOpaquePtr(), + return getSema().BuildTypesCompatibleExpr(BuiltinLoc, + TInfo1, TInfo2, RParenLoc); } @@ -4855,27 +4855,29 @@ TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { template<typename Derived> Sema::OwningExprResult TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { - QualType T1, T2; + TypeSourceInfo *TInfo1; + TypeSourceInfo *TInfo2; { // FIXME: Source location isn't quite accurate. TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); - T1 = getDerived().TransformType(E->getArgType1()); - if (T1.isNull()) + TInfo1 = getDerived().TransformType(E->getArgTInfo1()); + if (!TInfo1) return SemaRef.ExprError(); - T2 = getDerived().TransformType(E->getArgType2()); - if (T2.isNull()) + TInfo2 = getDerived().TransformType(E->getArgTInfo2()); + if (!TInfo2) return SemaRef.ExprError(); } if (!getDerived().AlwaysRebuild() && - T1 == E->getArgType1() && - T2 == E->getArgType2()) + TInfo1 == E->getArgTInfo1() && + TInfo2 == E->getArgTInfo2()) return SemaRef.Owned(E->Retain()); return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), - T1, T2, E->getRParenLoc()); + TInfo1, TInfo2, + E->getRParenLoc()); } template<typename Derived> |

