Browse Source

Improved template parsing error handling.

For an example of what can trigger it:

  template<typename _CharT, typename _Traits = char_traits<_CharT>,
           typename _Alloc = allocator<_CharT> >
    class basic_string;

  extern template class basic_string<char>;

Signed-off-by: Elias Holzer <elias@vvvv.org>
pull/248/head
triton 12 years ago committed by Elias Holzer
parent
commit
f61517c6f7
  1. 31
      src/CppParser/Parser.cpp

31
src/CppParser/Parser.cpp

@ -879,7 +879,8 @@ ClassTemplate* Parser::WalkClassTemplate(clang::ClassTemplateDecl* TD)
//-----------------------------------// //-----------------------------------//
std::vector<CppSharp::CppParser::TemplateArgument> std::vector<CppSharp::CppParser::TemplateArgument>
Parser::WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, clang::TemplateSpecializationTypeLoc* TSTL) Parser::WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL,
clang::TemplateSpecializationTypeLoc* TSTL)
{ {
using namespace clang; using namespace clang;
@ -888,8 +889,13 @@ Parser::WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, clang::
for (size_t i = 0, e = TAL->size(); i < e; i++) for (size_t i = 0, e = TAL->size(); i < e; i++)
{ {
auto TA = TAL->get(i); auto TA = TAL->get(i);
auto ArgLoc = TSTL->getArgLoc(i); TemplateArgumentLoc *ArgLoc = 0;
auto Arg = WalkTemplateArgument(TA, &ArgLoc); if (TSTL && i < TSTL->getNumArgs())
{
auto TAL = TSTL->getArgLoc(i);
ArgLoc = &TAL;
}
auto Arg = WalkTemplateArgument(TA, ArgLoc);
params.push_back(Arg); params.push_back(Arg);
} }
@ -1693,7 +1699,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (TS->isSugared()) if (TS->isSugared())
TST->Desugared = WalkType(TS->desugar()); TST->Desugared = WalkType(TS->desugar());
if (!TL->isNull()) if (TL && !TL->isNull())
{ {
auto TypeLocClass = TL->getTypeLocClass(); auto TypeLocClass = TL->getTypeLocClass();
if (TypeLocClass == TypeLoc::Qualified) if (TypeLocClass == TypeLoc::Qualified)
@ -1709,12 +1715,19 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
} }
assert(TL->getTypeLocClass() == TypeLoc::TemplateSpecialization); assert(TL->getTypeLocClass() == TypeLoc::TemplateSpecialization);
auto TSTL = TL->getAs<TemplateSpecializationTypeLoc>();
TST->Arguments = WalkTemplateArgumentList(
&TemplateArgumentList(TemplateArgumentList::OnStack, TS->getArgs(), TS->getNumArgs()),
&TSTL);
} }
TemplateSpecializationTypeLoc *TSTL = 0;
if (TL && !TL->isNull())
{
auto TSpecTL = TL->getAs<TemplateSpecializationTypeLoc>();
TSTL = &TSpecTL;
}
TemplateArgumentList TArgs(TemplateArgumentList::OnStack, TS->getArgs(),
TS->getNumArgs());
TST->Arguments = WalkTemplateArgumentList(&TArgs, TSTL);
Ty = TST; Ty = TST;
break; break;
} }
@ -1726,7 +1739,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
if (auto Ident = TP->getIdentifier()) if (auto Ident = TP->getIdentifier())
TPT->Parameter.Name = Ident->getName(); TPT->Parameter.Name = Ident->getName();
if (!TL->isNull()) if (TL && !TL->isNull())
{ {
auto TypeLocClass = TL->getTypeLocClass(); auto TypeLocClass = TL->getTypeLocClass();
if (TypeLocClass == TypeLoc::Qualified) if (TypeLocClass == TypeLoc::Qualified)

Loading…
Cancel
Save