diff options
Diffstat (limited to 'lib/Sema/TreeTransform.h')
-rw-r--r-- | lib/Sema/TreeTransform.h | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 208c885..445ef0d 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -975,12 +975,15 @@ public: QualType BaseType = ((Expr*) Base.get())->getType(); - // FIXME: wait, this is re-performing lookup? + LookupResult R(getSema(), Member->getDeclName(), MemberLoc, + Sema::LookupMemberName); + R.addDecl(Member); + R.resolveKind(); + return getSema().BuildMemberReferenceExpr(move(Base), BaseType, OpLoc, isArrow, SS, FirstQualifierInScope, - Member->getDeclName(), MemberLoc, - ExplicitTemplateArgs); + R, ExplicitTemplateArgs); } /// \brief Build a new binary operator expression. @@ -1344,9 +1347,11 @@ public: /// semantic analysis. Subclasses may override this routine to provide /// different behavior. OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, - QualType ThisType) { + QualType ThisType, + bool isImplicit) { return getSema().Owned( - new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); + new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, + isImplicit)); } /// \brief Build a new C++ throw expression. @@ -1559,6 +1564,7 @@ public: bool IsArrow, NestedNameSpecifier *Qualifier, SourceRange QualifierRange, + NamedDecl *FirstQualifierInScope, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs) { CXXScopeSpec SS; @@ -1567,7 +1573,8 @@ public: return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType, OperatorLoc, IsArrow, - SS, R, TemplateArgs); + SS, FirstQualifierInScope, + R, TemplateArgs); } /// \brief Build a new Objective-C @encode expression. @@ -2617,18 +2624,16 @@ QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, template<typename Derived> QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, TypeOfExprTypeLoc TL) { - TypeOfExprType *T = TL.getTypePtr(); - // typeof expressions are not potentially evaluated contexts EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); - Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); + Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); if (E.isInvalid()) return QualType(); QualType Result = TL.getType(); if (getDerived().AlwaysRebuild() || - E.get() != T->getUnderlyingExpr()) { + E.get() != TL.getUnderlyingExpr()) { Result = getDerived().RebuildTypeOfExprType(move(E)); if (Result.isNull()) return QualType(); @@ -2636,7 +2641,9 @@ QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, else E.take(); TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); - NewTL.setNameLoc(TL.getNameLoc()); + NewTL.setTypeofLoc(TL.getTypeofLoc()); + NewTL.setLParenLoc(TL.getLParenLoc()); + NewTL.setRParenLoc(TL.getRParenLoc()); return Result; } @@ -2644,23 +2651,23 @@ QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, template<typename Derived> QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, TypeOfTypeLoc TL) { - TypeOfType *T = TL.getTypePtr(); - - // FIXME: should be an inner type, or at least have a TypeSourceInfo. - QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); - if (Underlying.isNull()) + TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); + TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); + if (!New_Under_TI) return QualType(); QualType Result = TL.getType(); - if (getDerived().AlwaysRebuild() || - Underlying != T->getUnderlyingType()) { - Result = getDerived().RebuildTypeOfType(Underlying); + if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { + Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); if (Result.isNull()) return QualType(); } TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); - NewTL.setNameLoc(TL.getNameLoc()); + NewTL.setTypeofLoc(TL.getTypeofLoc()); + NewTL.setLParenLoc(TL.getLParenLoc()); + NewTL.setRParenLoc(TL.getRParenLoc()); + NewTL.setUnderlyingTInfo(New_Under_TI); return Result; } @@ -3711,6 +3718,12 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { SourceLocation FakeOperatorLoc = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); + // FIXME: to do this check properly, we will need to preserve the + // first-qualifier-in-scope here, just in case we had a dependent + // base (and therefore couldn't do the check) and a + // nested-name-qualifier (and therefore could do the lookup). + NamedDecl *FirstQualifierInScope = 0; + return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, E->isArrow(), Qualifier, @@ -3719,7 +3732,7 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { Member, (E->hasExplicitTemplateArgumentList() ? &TransArgs : 0), - 0); + FirstQualifierInScope); } template<typename Derived> @@ -4386,7 +4399,7 @@ TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { T == E->getType()) return SemaRef.Owned(E->Retain()); - return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); + return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); } template<typename Derived> @@ -5027,6 +5040,12 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) TransArgs.addArgument(Loc); } } + + // FIXME: to do this check properly, we will need to preserve the + // first-qualifier-in-scope here, just in case we had a dependent + // base (and therefore couldn't do the check) and a + // nested-name-qualifier (and therefore could do the lookup). + NamedDecl *FirstQualifierInScope = 0; return getDerived().RebuildUnresolvedMemberExpr(move(Base), BaseType, @@ -5034,6 +5053,7 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) Old->isArrow(), Qualifier, Old->getQualifierRange(), + FirstQualifierInScope, R, (Old->hasExplicitTemplateArgs() ? &TransArgs : 0)); |