diff options
| author | Abramo Bagnara <abramo.bagnara@gmail.com> | 2010-05-20 15:32:11 +0000 | 
|---|---|---|
| committer | Abramo Bagnara <abramo.bagnara@gmail.com> | 2010-05-20 15:32:11 +0000 | 
| commit | 02ccd28a92b1b3465fc2102ada983709e5ed407d (patch) | |
| tree | d5e8cccf856f88256037e093484c107ff24c0556 /clang | |
| parent | 80a9608442b4d6360fd2dacd9c3b37bdbe61e38a (diff) | |
| download | bcm5719-llvm-02ccd28a92b1b3465fc2102ada983709e5ed407d.tar.gz bcm5719-llvm-02ccd28a92b1b3465fc2102ada983709e5ed407d.zip  | |
Added TemplateArgumentListInfo to FunctionTemplateSpecializationInfo.
llvm-svn: 104226
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/AST/Decl.h | 13 | ||||
| -rw-r--r-- | clang/include/clang/AST/DeclTemplate.h | 3 | ||||
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 14 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 42 | 
4 files changed, 46 insertions, 26 deletions
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index 5ac920e892d..db23342b00b 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -1424,6 +1424,16 @@ public:    /// returns NULL.    const TemplateArgumentList *getTemplateSpecializationArgs() const; +  /// \brief Retrieve the template argument list as written in the sources, +  /// if any. +  /// +  /// If this function declaration is not a function template specialization +  /// or if it had no explicit template argument list, returns NULL. +  /// Note that it an explicit template argument list may be written empty, +  /// e.g., template<> void foo<>(char* s); +  const TemplateArgumentListInfo* +  getTemplateSpecializationArgsAsWritten() const; +    /// \brief Specify that this function declaration is actually a function    /// template specialization.    /// @@ -1443,7 +1453,8 @@ public:    void setFunctionTemplateSpecialization(FunctionTemplateDecl *Template,                                        const TemplateArgumentList *TemplateArgs,                                           void *InsertPos, -                    TemplateSpecializationKind TSK = TSK_ImplicitInstantiation); +                    TemplateSpecializationKind TSK = TSK_ImplicitInstantiation, +                    const TemplateArgumentListInfo *TemplateArgsAsWritten = 0);    /// \brief Specifies that this function declaration is actually a    /// dependent function template specialization. diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h index 040aad03ba5..dc4aecce038 100644 --- a/clang/include/clang/AST/DeclTemplate.h +++ b/clang/include/clang/AST/DeclTemplate.h @@ -283,6 +283,9 @@ public:    /// specialization from the function template.    const TemplateArgumentList *TemplateArguments; +  /// \brief The template arguments as written in the sources, if provided. +  const TemplateArgumentListInfo *TemplateArgumentsAsWritten; +    /// \brief The point at which this function template specialization was    /// first instantiated.     SourceLocation PointOfInstantiation; diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index b8bd3109929..695a8b8b514 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -1289,11 +1289,22 @@ FunctionDecl::getTemplateSpecializationArgs() const {    return 0;  } +const TemplateArgumentListInfo * +FunctionDecl::getTemplateSpecializationArgsAsWritten() const { +  if (FunctionTemplateSpecializationInfo *Info +        = TemplateOrSpecialization +            .dyn_cast<FunctionTemplateSpecializationInfo*>()) { +    return Info->TemplateArgumentsAsWritten; +  } +  return 0; +} +  void  FunctionDecl::setFunctionTemplateSpecialization(FunctionTemplateDecl *Template,                                       const TemplateArgumentList *TemplateArgs,                                                  void *InsertPos, -                                              TemplateSpecializationKind TSK) { +                                                TemplateSpecializationKind TSK, +                        const TemplateArgumentListInfo *TemplateArgsAsWritten) {    assert(TSK != TSK_Undeclared &&            "Must specify the type of function template specialization");    FunctionTemplateSpecializationInfo *Info @@ -1305,6 +1316,7 @@ FunctionDecl::setFunctionTemplateSpecialization(FunctionTemplateDecl *Template,    Info->Template.setPointer(Template);    Info->Template.setInt(TSK - 1);    Info->TemplateArguments = TemplateArgs; +  Info->TemplateArgumentsAsWritten = TemplateArgsAsWritten;    TemplateOrSpecialization = Info;    // Insert this function template specialization into the set of known diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 8eab30bd366..6a4f34731ea 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -4219,10 +4219,10 @@ Sema::CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD,    return false;  } -/// \brief Perform semantic analysis for the given function template  +/// \brief Perform semantic analysis for the given function template  /// specialization.  /// -/// This routine performs all of the semantic analysis required for an  +/// This routine performs all of the semantic analysis required for an  /// explicit function template specialization. On successful completion,  /// the function declaration \p FD will become a function template  /// specialization. @@ -4230,24 +4230,14 @@ Sema::CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD,  /// \param FD the function declaration, which will be updated to become a  /// function template specialization.  /// -/// \param HasExplicitTemplateArgs whether any template arguments were -/// explicitly provided. -/// -/// \param LAngleLoc the location of the left angle bracket ('<'), if -/// template arguments were explicitly provided. -/// -/// \param ExplicitTemplateArgs the explicitly-provided template arguments,  -/// if any. -/// -/// \param NumExplicitTemplateArgs the number of explicitly-provided template -/// arguments. This number may be zero even when HasExplicitTemplateArgs is -/// true as in, e.g., \c void sort<>(char*, char*); +/// \param ExplicitTemplateArgs the explicitly-provided template arguments, +/// if any. Note that this may be valid info even when 0 arguments are +/// explicitly provided as in, e.g., \c void sort<>(char*, char*); +/// as it anyway contains info on the angle brackets locations.  /// -/// \param RAngleLoc the location of the right angle bracket ('>'), if -/// template arguments were explicitly provided. -///  -/// \param PrevDecl the set of declarations that  -bool  +/// \param PrevDecl the set of declarations that may be specialized by +/// this function specialization. +bool  Sema::CheckFunctionTemplateSpecialization(FunctionDecl *FD,                          const TemplateArgumentListInfo *ExplicitTemplateArgs,                                            LookupResult &Previous) { @@ -4349,12 +4339,16 @@ Sema::CheckFunctionTemplateSpecialization(FunctionDecl *FD,    // Turn the given function declaration into a function template    // specialization, with the template arguments from the previous    // specialization. +  // Take copies of (semantic and syntactic) template argument lists. +  const TemplateArgumentList* TemplArgs = new (Context) +    TemplateArgumentList(Specialization->getTemplateSpecializationArgs()); +  const TemplateArgumentListInfo* TemplArgsAsWritten = ExplicitTemplateArgs +    ? new (Context) TemplateArgumentListInfo(*ExplicitTemplateArgs) : 0;    FD->setFunctionTemplateSpecialization(Specialization->getPrimaryTemplate(), -                         new (Context) TemplateArgumentList( -                             Specialization->getTemplateSpecializationArgs()),  -                                        /*InsertPos=*/0,  -                                    SpecInfo->getTemplateSpecializationKind()); -   +                                        TemplArgs, /*InsertPos=*/0, +                                    SpecInfo->getTemplateSpecializationKind(), +                                        TemplArgsAsWritten); +    // The "previous declaration" for this function template specialization is    // the prior function template specialization.    Previous.clear();  | 

