logic: fixed infinite iteration when trying to solve parent name of C++ template arguments with multiple parent contexts in Clang AST (this is a very rare edge case)

This commit is contained in:
mlangkabel
2018-11-12 15:28:54 +01:00
parent 8188fbd7be
commit 5d64910083
2 changed files with 16 additions and 4 deletions
+4 -4
View File
@@ -5,14 +5,14 @@ template <typename T>
class ScopedSwitcher
{
public:
ScopedSwitcher(T &var)
ScopedSwitcher(T &var)
: m_var(&var)
, m_origVal(var)
, m_origVal(var)
{}
ScopedSwitcher(T &var, T tempVal)
ScopedSwitcher(T &var, T tempVal)
: m_var(&var)
, m_origVal(var)
, m_origVal(var)
{
var = tempVal;
}
@@ -68,6 +68,8 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getName(const clang::NamedDecl
clang::ASTContext::DynTypedNodeList parents = declaration->getASTContext().getParents(*declaration);
for (const clang::ast_type_traits::DynTypedNode* parent = parents.begin(); parent != parents.end(); parent++)
{
bool foundParent = false;
const clang::Decl* parentDecl = parent->get<clang::Decl>();
while (parentDecl != nullptr)
{
@@ -80,6 +82,7 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getName(const clang::NamedDecl
{
declName->setParent(getName(parentTemplateDecl));
}
foundParent = true;
break;
}
else if (clang::isa<clang::ClassTemplatePartialSpecializationDecl>(parentDecl))
@@ -90,6 +93,7 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getName(const clang::NamedDecl
{
declName->setParent(getName(parentClassTemplateDecl));
}
foundParent = true;
break;
}
else if (clang::isa<clang::VarTemplatePartialSpecializationDecl>(parentDecl))
@@ -100,6 +104,7 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getName(const clang::NamedDecl
{
declName->setParent(getName(parentVarTemplateDecl));
}
foundParent = true;
break;
}
@@ -107,6 +112,7 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getName(const clang::NamedDecl
{
if (ignoresContext(parentDeclContext))
{
foundParent = true;
break;
}
parentDecl = clang::dyn_cast_or_null<clang::Decl>(parentDeclContext);
@@ -123,6 +129,12 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getName(const clang::NamedDecl
break;
}
}
if (foundParent)
{
// break for the first parent ast node that can be resolved to a parent name (also if it is ignored).
break;
}
}
}
else