diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-04-02 08:55:10 +0000 | 
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-04-02 08:55:10 +0000 | 
| commit | 11d2b2d2bb706fca0656f2760839721bb7f6cb6f (patch) | |
| tree | d374cdca417e76f1bf101f139dba2db1d10ee8f7 /lib/AST/Expr.cpp | |
| parent | c0c7bca4e5b8d12699dc93a0da49e9e4bb79671b (diff) | |
Notes
Diffstat (limited to 'lib/AST/Expr.cpp')
| -rw-r--r-- | lib/AST/Expr.cpp | 62 | 
1 files changed, 36 insertions, 26 deletions
| diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 6a71e925d9b3f..6764612c80b6d 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -492,44 +492,45 @@ QualType CallExpr::getCallReturnType() const {    return FnType->getResultType();  } -MemberExpr::MemberExpr(Expr *base, bool isarrow, NestedNameSpecifier *qual, -                       SourceRange qualrange, ValueDecl *memberdecl, -                       SourceLocation l, const TemplateArgumentListInfo *targs, -                       QualType ty) -  : Expr(MemberExprClass, ty, -         base->isTypeDependent() || (qual && qual->isDependent()), -         base->isValueDependent() || (qual && qual->isDependent())), -    Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow), -    HasQualifier(qual != 0), HasExplicitTemplateArgumentList(targs) { -  // Initialize the qualifier, if any. -  if (HasQualifier) { -    NameQualifier *NQ = getMemberQualifier(); -    NQ->NNS = qual; -    NQ->Range = qualrange; -  } - -  // Initialize the explicit template argument list, if any. -  if (targs) -    getExplicitTemplateArgumentList()->initializeFrom(*targs); -} -  MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,                                 NestedNameSpecifier *qual,                                 SourceRange qualrange,                                 ValueDecl *memberdecl, +                               NamedDecl *founddecl,                                 SourceLocation l,                                 const TemplateArgumentListInfo *targs,                                 QualType ty) {    std::size_t Size = sizeof(MemberExpr); -  if (qual != 0) -    Size += sizeof(NameQualifier); + +  bool hasQualOrFound = (qual != 0 || founddecl != memberdecl); +  if (hasQualOrFound) +    Size += sizeof(MemberNameQualifier);    if (targs)      Size += ExplicitTemplateArgumentList::sizeFor(*targs);    void *Mem = C.Allocate(Size, llvm::alignof<MemberExpr>()); -  return new (Mem) MemberExpr(base, isarrow, qual, qualrange, memberdecl, l, -                              targs, ty); +  MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, l, ty); + +  if (hasQualOrFound) { +    if (qual && qual->isDependent()) { +      E->setValueDependent(true); +      E->setTypeDependent(true); +    } +    E->HasQualifierOrFoundDecl = true; + +    MemberNameQualifier *NQ = E->getMemberQualifier(); +    NQ->NNS = qual; +    NQ->Range = qualrange; +    NQ->FoundDecl = founddecl; +  } + +  if (targs) { +    E->HasExplicitTemplateArgumentList = true; +    E->getExplicitTemplateArgumentList()->initializeFrom(*targs); +  } + +  return E;  }  const char *CastExpr::getCastKindName() const { @@ -544,6 +545,8 @@ const char *CastExpr::getCastKindName() const {      return "BaseToDerived";    case CastExpr::CK_DerivedToBase:      return "DerivedToBase"; +  case CastExpr::CK_UncheckedDerivedToBase: +    return "UncheckedDerivedToBase";    case CastExpr::CK_Dynamic:      return "Dynamic";    case CastExpr::CK_ToUnion: @@ -914,8 +917,15 @@ bool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,    case CXXConstructExprClass:      return false; -  case ObjCMessageExprClass: +  case ObjCMessageExprClass: { +    const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this); +    const ObjCMethodDecl *MD = ME->getMethodDecl(); +    if (MD && MD->getAttr<WarnUnusedResultAttr>()) { +      Loc = getExprLoc(); +      return true; +    }      return false; +  }    case ObjCImplicitSetterGetterRefExprClass: {   // Dot syntax for message send.  #if 0 | 
