Browse Source

Improve robustness when handling unexpected FunctionProto type locs.

Fixes an error when parsing Boost code (tuple_basic.hpp).

```
// Swallows any assignment   (by Doug Gregor)
namespace detail {

struct swallow_assign;
typedef void (detail::swallow_assign::*ignore_t)();
struct swallow_assign {
  swallow_assign(ignore_t(*)(ignore_t)) {}
  template<typename T>
  swallow_assign const& operator=(const T&) const {
    return *this;
  }
};

} // namespace detail

template<>
struct make_tuple_traits<detail::ignore_t(detail::ignore_t)> {
  typedef detail::swallow_assign type;
};
```
pull/553/head
triton 10 years ago
parent
commit
ce7d6b2dc4
  1. 9
      src/CppParser/Parser.cpp

9
src/CppParser/Parser.cpp

@ -1807,14 +1807,17 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, @@ -1807,14 +1807,17 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
TypeLoc Next;
if (TL && !TL->isNull())
{
while (TL->getTypeLocClass() != TypeLoc::FunctionProto)
while (!TL->isNull() && TL->getTypeLocClass() != TypeLoc::FunctionProto)
{
Next = TL->getNextTypeLoc();
TL = &Next;
}
FTL = TL->getAs<FunctionProtoTypeLoc>();
RL = FTL.getReturnLoc();
if (!TL->isNull() && TL->getTypeLocClass() == TypeLoc::FunctionProto)
{
FTL = TL->getAs<FunctionProtoTypeLoc>();
RL = FTL.getReturnLoc();
}
}
auto F = new FunctionType();

Loading…
Cancel
Save