diff options
| -rw-r--r-- | clang/include/clang/AST/Expr.h | 133 | ||||
| -rw-r--r-- | clang/include/clang/AST/ExprCXX.h | 68 | ||||
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 10 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTReaderStmt.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriterStmt.cpp | 9 | 
8 files changed, 140 insertions, 100 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 1c3a954e56f..6aca9b0ef5f 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -542,26 +542,7 @@ class DeclRefExpr : public Expr {    const NameQualifier *getNameQualifier() const {      return const_cast<DeclRefExpr *>(this)->getNameQualifier();    } -   -  /// \brief Retrieve the explicit template argument list that followed the -  /// member template name, if any. -  ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() { -    if ((DecoratedD.getInt() & HasExplicitTemplateArgumentListFlag) == 0) -      return 0; -     -    if ((DecoratedD.getInt() & HasQualifierFlag) == 0) -      return reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); -     -    return reinterpret_cast<ExplicitTemplateArgumentList *>( -                                                      getNameQualifier() + 1); -  } -   -  /// \brief Retrieve the explicit template argument list that followed the -  /// member template name, if any. -  const ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() const { -    return const_cast<DeclRefExpr *>(this)->getExplicitTemplateArgumentList(); -  } -   +    DeclRefExpr(NestedNameSpecifier *Qualifier, SourceRange QualifierRange,                ValueDecl *D, SourceLocation NameLoc,                const TemplateArgumentListInfo *TemplateArgs, @@ -641,53 +622,77 @@ public:      return getNameQualifier()->NNS;    } -  /// \brief Determines whether this member expression actually had a C++ -  /// template argument list explicitly specified, e.g., x.f<int>. -  bool hasExplicitTemplateArgumentList() const { -    return DecoratedD.getInt() & HasExplicitTemplateArgumentListFlag; +  bool hasExplicitTemplateArgs() const { +    return (DecoratedD.getInt() & HasExplicitTemplateArgumentListFlag); +  } +   +  /// \brief Retrieve the explicit template argument list that followed the +  /// member template name. +  ExplicitTemplateArgumentList &getExplicitTemplateArgs() { +    assert(hasExplicitTemplateArgs()); + +    if ((DecoratedD.getInt() & HasQualifierFlag) == 0) +      return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); +     +    return *reinterpret_cast<ExplicitTemplateArgumentList *>( +                                                      getNameQualifier() + 1); +  } +   +  /// \brief Retrieve the explicit template argument list that followed the +  /// member template name. +  const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const { +    return const_cast<DeclRefExpr *>(this)->getExplicitTemplateArgs();    } +  /// \brief Retrieves the optional explicit template arguments. +  /// This points to the same data as getExplicitTemplateArgs(), but +  /// returns null if there are no explicit template arguments. +  const ExplicitTemplateArgumentList *getExplicitTemplateArgsOpt() const { +    if (!hasExplicitTemplateArgs()) return 0; +    return &getExplicitTemplateArgs(); +  } +      /// \brief Copies the template arguments (if present) into the given    /// structure.    void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { -    if (hasExplicitTemplateArgumentList()) -      getExplicitTemplateArgumentList()->copyInto(List); +    if (hasExplicitTemplateArgs()) +      getExplicitTemplateArgs().copyInto(List);    }    /// \brief Retrieve the location of the left angle bracket following the    /// member name ('<'), if any.    SourceLocation getLAngleLoc() const { -    if (!hasExplicitTemplateArgumentList()) +    if (!hasExplicitTemplateArgs())        return SourceLocation(); -    return getExplicitTemplateArgumentList()->LAngleLoc; +    return getExplicitTemplateArgs().LAngleLoc;    }    /// \brief Retrieve the template arguments provided as part of this    /// template-id.    const TemplateArgumentLoc *getTemplateArgs() const { -    if (!hasExplicitTemplateArgumentList()) +    if (!hasExplicitTemplateArgs())        return 0; -    return getExplicitTemplateArgumentList()->getTemplateArgs(); +    return getExplicitTemplateArgs().getTemplateArgs();    }    /// \brief Retrieve the number of template arguments provided as part of this    /// template-id.    unsigned getNumTemplateArgs() const { -    if (!hasExplicitTemplateArgumentList()) +    if (!hasExplicitTemplateArgs())        return 0; -    return getExplicitTemplateArgumentList()->NumTemplateArgs; +    return getExplicitTemplateArgs().NumTemplateArgs;    }    /// \brief Retrieve the location of the right angle bracket following the    /// template arguments ('>').    SourceLocation getRAngleLoc() const { -    if (!hasExplicitTemplateArgumentList()) +    if (!hasExplicitTemplateArgs())        return SourceLocation(); -    return getExplicitTemplateArgumentList()->RAngleLoc; +    return getExplicitTemplateArgs().RAngleLoc;    }    static bool classof(const Stmt *T) { @@ -1630,25 +1635,6 @@ class MemberExpr : public Expr {      return const_cast<MemberExpr *>(this)->getMemberQualifier();    } -  /// \brief Retrieve the explicit template argument list that followed the -  /// member template name, if any. -  ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() { -    if (!HasExplicitTemplateArgumentList) -      return 0; - -    if (!HasQualifierOrFoundDecl) -      return reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); - -    return reinterpret_cast<ExplicitTemplateArgumentList *>( -                                                      getMemberQualifier() + 1); -  } - -  /// \brief Retrieve the explicit template argument list that followed the -  /// member template name, if any. -  const ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() const { -    return const_cast<MemberExpr *>(this)->getExplicitTemplateArgumentList(); -  } -  public:    MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl,               const DeclarationNameInfo &NameInfo, QualType ty) @@ -1724,15 +1710,42 @@ public:    /// \brief Determines whether this member expression actually had a C++    /// template argument list explicitly specified, e.g., x.f<int>. -  bool hasExplicitTemplateArgumentList() const { +  bool hasExplicitTemplateArgs() const {      return HasExplicitTemplateArgumentList;    }    /// \brief Copies the template arguments (if present) into the given    /// structure.    void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { -    if (hasExplicitTemplateArgumentList()) -      getExplicitTemplateArgumentList()->copyInto(List); +    if (hasExplicitTemplateArgs()) +      getExplicitTemplateArgs().copyInto(List); +  } + +  /// \brief Retrieve the explicit template argument list that +  /// follow the member template name.  This must only be called on an +  /// expression with explicit template arguments. +  ExplicitTemplateArgumentList &getExplicitTemplateArgs() { +    assert(HasExplicitTemplateArgumentList); +    if (!HasQualifierOrFoundDecl) +      return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); + +    return *reinterpret_cast<ExplicitTemplateArgumentList *>( +                                                      getMemberQualifier() + 1); +  } + +  /// \brief Retrieve the explicit template argument list that +  /// followed the member template name.  This must only be called on +  /// an expression with explicit template arguments. +  const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const { +    return const_cast<MemberExpr *>(this)->getExplicitTemplateArgs(); +  } + +  /// \brief Retrieves the optional explicit template arguments. +  /// This points to the same data as getExplicitTemplateArgs(), but +  /// returns null if there are no explicit template arguments. +  const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() const { +    if (!hasExplicitTemplateArgs()) return 0; +    return &getExplicitTemplateArgs();    }    /// \brief Retrieve the location of the left angle bracket following the @@ -1741,7 +1754,7 @@ public:      if (!HasExplicitTemplateArgumentList)        return SourceLocation(); -    return getExplicitTemplateArgumentList()->LAngleLoc; +    return getExplicitTemplateArgs().LAngleLoc;    }    /// \brief Retrieve the template arguments provided as part of this @@ -1750,7 +1763,7 @@ public:      if (!HasExplicitTemplateArgumentList)        return 0; -    return getExplicitTemplateArgumentList()->getTemplateArgs(); +    return getExplicitTemplateArgs().getTemplateArgs();    }    /// \brief Retrieve the number of template arguments provided as part of this @@ -1759,7 +1772,7 @@ public:      if (!HasExplicitTemplateArgumentList)        return 0; -    return getExplicitTemplateArgumentList()->NumTemplateArgs; +    return getExplicitTemplateArgs().NumTemplateArgs;    }    /// \brief Retrieve the location of the right angle bracket following the @@ -1768,7 +1781,7 @@ public:      if (!HasExplicitTemplateArgumentList)        return SourceLocation(); -    return getExplicitTemplateArgumentList()->RAngleLoc; +    return getExplicitTemplateArgs().RAngleLoc;    }    /// \brief Retrieve the member declaration name info. diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 96416aec6a6..418bb26e5bd 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -1500,10 +1500,12 @@ public:      return const_cast<OverloadExpr*>(this)->getExplicitTemplateArgs();    } -  ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() { -    if (hasExplicitTemplateArgs()) -      return &getExplicitTemplateArgs(); -    return 0; +  /// \brief Retrieves the optional explicit template arguments. +  /// This points to the same data as getExplicitTemplateArgs(), but +  /// returns null if there are no explicit template arguments. +  const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() { +    if (!hasExplicitTemplateArgs()) return 0; +    return &getExplicitTemplateArgs();    }    static bool classof(const Stmt *T) { @@ -1618,6 +1620,14 @@ public:      return *reinterpret_cast<const ExplicitTemplateArgumentList*>(this + 1);    } +  /// \brief Retrieves the optional explicit template arguments. +  /// This points to the same data as getExplicitTemplateArgs(), but +  /// returns null if there are no explicit template arguments. +  const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() { +    if (!hasExplicitTemplateArgs()) return 0; +    return &getExplicitTemplateArgs(); +  } +    /// \brief Copies the template arguments (if present) into the given    /// structure.    void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { @@ -1744,6 +1754,14 @@ public:      return *reinterpret_cast<const ExplicitTemplateArgumentList*>(this + 1);    } +  /// \brief Retrieves the optional explicit template arguments. +  /// This points to the same data as getExplicitTemplateArgs(), but +  /// returns null if there are no explicit template arguments. +  const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() { +    if (!hasExplicitTemplateArgs()) return 0; +    return &getExplicitTemplateArgs(); +  } +    /// \brief Copies the template arguments (if present) into the given    /// structure.    void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { @@ -2118,57 +2136,59 @@ public:    /// \brief Retrieve the explicit template argument list that followed the    /// member template name, if any. -  ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() { +  ExplicitTemplateArgumentList &getExplicitTemplateArgs() {      assert(HasExplicitTemplateArgs); -    return reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1); +    return *reinterpret_cast<ExplicitTemplateArgumentList *>(this + 1);    }    /// \brief Retrieve the explicit template argument list that followed the    /// member template name, if any. -  const ExplicitTemplateArgumentList *getExplicitTemplateArgumentList() const { +  const ExplicitTemplateArgumentList &getExplicitTemplateArgs() const {      return const_cast<CXXDependentScopeMemberExpr *>(this) -             ->getExplicitTemplateArgumentList(); +             ->getExplicitTemplateArgs(); +  } + +  /// \brief Retrieves the optional explicit template arguments. +  /// This points to the same data as getExplicitTemplateArgs(), but +  /// returns null if there are no explicit template arguments. +  const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() { +    if (!hasExplicitTemplateArgs()) return 0; +    return &getExplicitTemplateArgs();    }    /// \brief Copies the template arguments (if present) into the given    /// structure.    void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const { -    assert(HasExplicitTemplateArgs); -    getExplicitTemplateArgumentList()->copyInto(List); +    getExplicitTemplateArgs().copyInto(List);    }    /// \brief Initializes the template arguments using the given structure.    void initializeTemplateArgumentsFrom(const TemplateArgumentListInfo &List) { -    assert(HasExplicitTemplateArgs); -    getExplicitTemplateArgumentList()->initializeFrom(List); +    getExplicitTemplateArgs().initializeFrom(List);    }    /// \brief Retrieve the location of the left angle bracket following the    /// member name ('<'), if any.    SourceLocation getLAngleLoc() const { -    assert(HasExplicitTemplateArgs); -    return getExplicitTemplateArgumentList()->LAngleLoc; +    return getExplicitTemplateArgs().LAngleLoc;    }    /// \brief Retrieve the template arguments provided as part of this    /// template-id.    const TemplateArgumentLoc *getTemplateArgs() const { -    assert(HasExplicitTemplateArgs); -    return getExplicitTemplateArgumentList()->getTemplateArgs(); +    return getExplicitTemplateArgs().getTemplateArgs();    }    /// \brief Retrieve the number of template arguments provided as part of this    /// template-id.    unsigned getNumTemplateArgs() const { -    assert(HasExplicitTemplateArgs); -    return getExplicitTemplateArgumentList()->NumTemplateArgs; +    return getExplicitTemplateArgs().NumTemplateArgs;    }    /// \brief Retrieve the location of the right angle bracket following the    /// template arguments ('>').    SourceLocation getRAngleLoc() const { -    assert(HasExplicitTemplateArgs); -    return getExplicitTemplateArgumentList()->RAngleLoc; +    return getExplicitTemplateArgs().RAngleLoc;    }    virtual SourceRange getSourceRange() const { @@ -2324,6 +2344,14 @@ public:      return *reinterpret_cast<const ExplicitTemplateArgumentList *>(this + 1);    } +  /// \brief Retrieves the optional explicit template arguments. +  /// This points to the same data as getExplicitTemplateArgs(), but +  /// returns null if there are no explicit template arguments. +  const ExplicitTemplateArgumentList *getOptionalExplicitTemplateArgs() { +    if (!hasExplicitTemplateArgs()) return 0; +    return &getExplicitTemplateArgs(); +  } +    /// \brief Copies the template arguments into the given structure.    void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {      getExplicitTemplateArgs().copyInto(List); diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 7b1828cfee8..1399e004675 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -151,7 +151,7 @@ void DeclRefExpr::computeDependence() {      ValueDependent = true;    }    //  (TD)  - a template-id that is dependent, -  else if (hasExplicitTemplateArgumentList() &&  +  else if (hasExplicitTemplateArgs() &&              TemplateSpecializationType::anyDependentTemplateArguments(                                                         getTemplateArgs(),                                                          getNumTemplateArgs())) { @@ -204,7 +204,7 @@ DeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier,    }    if (TemplateArgs) -    getExplicitTemplateArgumentList()->initializeFrom(*TemplateArgs); +    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);    computeDependence();  } @@ -226,7 +226,7 @@ DeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier,    }    if (TemplateArgs) -    getExplicitTemplateArgumentList()->initializeFrom(*TemplateArgs); +    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);    computeDependence();  } @@ -279,7 +279,7 @@ SourceRange DeclRefExpr::getSourceRange() const {    SourceRange R = getNameInfo().getSourceRange();    if (hasQualifier())      R.setBegin(getQualifierRange().getBegin()); -  if (hasExplicitTemplateArgumentList()) +  if (hasExplicitTemplateArgs())      R.setEnd(getRAngleLoc());    return R;  } @@ -686,7 +686,7 @@ MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,    if (targs) {      E->HasExplicitTemplateArgumentList = true; -    E->getExplicitTemplateArgumentList()->initializeFrom(*targs); +    E->getExplicitTemplateArgs().initializeFrom(*targs);    }    return E; diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 458206276c4..9161c1c0807 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -759,7 +759,7 @@ CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,      FirstQualifierFoundInScope(FirstQualifierFoundInScope),      MemberNameInfo(MemberNameInfo) {    if (TemplateArgs) -    getExplicitTemplateArgumentList()->initializeFrom(*TemplateArgs); +    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);  }  CXXDependentScopeMemberExpr * diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index d648dac9d12..583a7a95a49 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -470,7 +470,7 @@ void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {    if (NestedNameSpecifier *Qualifier = Node->getQualifier())      Qualifier->print(OS, Policy);    OS << Node->getNameInfo(); -  if (Node->hasExplicitTemplateArgumentList()) +  if (Node->hasExplicitTemplateArgs())      OS << TemplateSpecializationType::PrintTemplateArgumentList(                                                      Node->getTemplateArgs(),                                                      Node->getNumTemplateArgs(), @@ -753,7 +753,7 @@ void StmtPrinter::VisitMemberExpr(MemberExpr *Node) {    OS << Node->getMemberNameInfo(); -  if (Node->hasExplicitTemplateArgumentList()) +  if (Node->hasExplicitTemplateArgs())      OS << TemplateSpecializationType::PrintTemplateArgumentList(                                                      Node->getTemplateArgs(),                                                      Node->getNumTemplateArgs(), diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index fc6c7f08e09..9fa34f984fb 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -4225,7 +4225,7 @@ TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {        Qualifier == E->getQualifier() &&        ND == E->getDecl() &&        NameInfo.getName() == E->getDecl()->getDeclName() && -      !E->hasExplicitTemplateArgumentList()) { +      !E->hasExplicitTemplateArgs()) {      // Mark it referenced in the new context regardless.      // FIXME: this is a bit instantiation-specific. @@ -4235,7 +4235,7 @@ TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {    }    TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; -  if (E->hasExplicitTemplateArgumentList()) { +  if (E->hasExplicitTemplateArgs()) {      TemplateArgs = &TransArgs;      TransArgs.setLAngleLoc(E->getLAngleLoc());      TransArgs.setRAngleLoc(E->getRAngleLoc()); @@ -4513,7 +4513,7 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {        Qualifier == E->getQualifier() &&        Member == E->getMemberDecl() &&        FoundDecl == E->getFoundDecl() && -      !E->hasExplicitTemplateArgumentList()) { +      !E->hasExplicitTemplateArgs()) {      // Mark it referenced in the new context regardless.      // FIXME: this is a bit instantiation-specific. @@ -4522,7 +4522,7 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {    }    TemplateArgumentListInfo TransArgs; -  if (E->hasExplicitTemplateArgumentList()) { +  if (E->hasExplicitTemplateArgs()) {      TransArgs.setLAngleLoc(E->getLAngleLoc());      TransArgs.setRAngleLoc(E->getRAngleLoc());      for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { @@ -4550,7 +4550,7 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {                                          E->getMemberNameInfo(),                                          Member,                                          FoundDecl, -                                        (E->hasExplicitTemplateArgumentList() +                                        (E->hasExplicitTemplateArgs()                                             ? &TransArgs : 0),                                          FirstQualifierInScope);  } diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 142f9306e31..cd1105f3363 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -398,7 +398,7 @@ void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {    }    if (NumTemplateArgs) -    ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(), +    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),                                       NumTemplateArgs);    E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++]))); @@ -1145,7 +1145,7 @@ ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){    assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&           "Read wrong record during creation ?");    if (E->hasExplicitTemplateArgs()) -    ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(), +    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),                                       NumTemplateArgs);    E->setBase(Reader.ReadSubExpr()); diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 716d21c84d9..1bb9d1934fa 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -369,7 +369,7 @@ void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {    Record.push_back(E->hasQualifier());    unsigned NumTemplateArgs = E->getNumTemplateArgs(); -  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgumentList() && +  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&           "Template args list with no args ?");    Record.push_back(NumTemplateArgs); @@ -379,7 +379,7 @@ void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {    }    if (NumTemplateArgs) -    AddExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList()); +    AddExplicitTemplateArgumentList(E->getExplicitTemplateArgs());    Writer.AddDeclRef(E->getDecl(), Record);    // FIXME: write DeclarationNameLoc. @@ -535,7 +535,7 @@ void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {    }    unsigned NumTemplateArgs = E->getNumTemplateArgs(); -  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgumentList() && +  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&           "Template args list with no args ?");    Record.push_back(NumTemplateArgs);    if (NumTemplateArgs) { @@ -1159,8 +1159,7 @@ ASTStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){    // Don't emit anything here, NumTemplateArgs must be emitted first.    if (E->hasExplicitTemplateArgs()) { -    const ExplicitTemplateArgumentList &Args -      = *E->getExplicitTemplateArgumentList(); +    const ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs();      assert(Args.NumTemplateArgs &&             "Num of template args was zero! AST reading will mess up!");      Record.push_back(Args.NumTemplateArgs);  | 

