diff options
author | Douglas Gregor <dgregor@apple.com> | 2008-12-18 19:37:40 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2008-12-18 19:37:40 +0000 |
commit | d6fb7ef028d9aa0b3e8943b7bc049c524437b407 (patch) | |
tree | 3e378ac3ed8c27d88bf386b5e822433829a3908d /lib/Sema/SemaTemplate.cpp | |
parent | 80d2f3059326f99ebf7c867db1c7f106ec9485f5 (diff) |
Ultrasimplistic sketch for the parsing of C++ template-ids. This won't
become useful or correct until we (1) parse template arguments
correctly, (2) have some way to turn template-ids into types,
declarators, etc., and (3) have a real representation of templates.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61208 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 2dcb9fe336..d300f283b6 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -18,6 +18,42 @@ using namespace clang; +/// isTemplateName - Determines whether the identifier II is a +/// template name in the current scope, and returns the template +/// declaration if II names a template. An optional CXXScope can be +/// passed to indicate the C++ scope in which the identifier will be +/// found. +Sema::DeclTy *Sema::isTemplateName(IdentifierInfo &II, Scope *S, + const CXXScopeSpec *SS) { + DeclContext *DC = 0; + if (SS) { + if (SS->isInvalid()) + return 0; + DC = static_cast<DeclContext*>(SS->getScopeRep()); + } + Decl *IIDecl = LookupDecl(&II, Decl::IDNS_Ordinary, S, DC, false); + + if (IIDecl) { + // FIXME: We need to represent templates via some kind of + // TemplateDecl, because what follows is a hack that only works in + // one specific case. + if (FunctionDecl *FD = dyn_cast<FunctionDecl>(IIDecl)) { + if (FD->getType()->isDependentType()) + return FD; + } else if (OverloadedFunctionDecl *Ovl + = dyn_cast<OverloadedFunctionDecl>(IIDecl)) { + for (OverloadedFunctionDecl::function_iterator F = Ovl->function_begin(), + FEnd = Ovl->function_end(); + F != FEnd; ++F) { + if ((*F)->getType()->isDependentType()) + return Ovl; + } + } + return 0; + } + return 0; +} + /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining /// that the template parameter 'PrevDecl' is being shadowed by a new /// declaration at location Loc. Returns true to indicate that this is |