Skip to content

Commit f03e2e1

Browse files
committed
issue #10951 Computing class inheritance relations → segmentation fault when run against vulkan-hpp headers
1 parent e512970 commit f03e2e1

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

src/util.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4646,8 +4646,7 @@ QCString substituteTemplateArgumentsInString(
46464646
const ArgumentList &formalArgs,
46474647
const ArgumentList *actualArgs)
46484648
{
4649-
//printf("> substituteTemplateArgumentsInString(name=%s formal=%s actualArg=%s)\n",
4650-
// qPrint(nm),qPrint(argListToString(formalArgs)),actualArgs ? qPrint(argListToString(*actualArgs)): "");
4649+
AUTO_TRACE("name={} formalArgs={} actualArgs={}",nm,argListToString(formalArgs),actualArgs ? argListToString(*actualArgs) : QCString());
46514650
if (formalArgs.empty()) return nm;
46524651
QCString result;
46534652

@@ -4711,21 +4710,33 @@ QCString substituteTemplateArgumentsInString(
47114710
{
47124711
if (formArg.name==n && actualArgs && actIt!=actualArgs->end() && !actArg.type.isEmpty()) // base class is a template argument
47134712
{
4714-
static constexpr auto hasRecursion = [](const QCString &nameArg,const QCString &subst) -> bool
4713+
static constexpr auto hasRecursion = [](const QCString &prefix,const QCString &nameArg,const QCString &subst) -> bool
47154714
{
47164715
int ii=0;
47174716
int pp=0;
4717+
4718+
ii = subst.find('<');
4719+
//printf("prefix='%s' subst='%s'\n",qPrint(prefix.mid(prefix.length()-ii-2,ii+1)),qPrint(subst.left(ii+1)));
4720+
if (ii!=-1 && static_cast<int>(prefix.length())>=ii+2 && prefix.mid(prefix.length()-ii-2,ii+1)==subst.left(ii+1))
4721+
{
4722+
return true; // don't replace 'A< ' with 'A< A<...', see issue #10951
4723+
}
4724+
47184725
while ((ii=subst.find(nameArg,pp))!=-1)
47194726
{
47204727
bool beforeNonWord = ii==0 || !isId(subst.at(ii-1));
47214728
bool afterNonWord = subst.length()==ii+nameArg.length() || !isId(subst.at(ii+nameArg.length()));
4722-
if (beforeNonWord && afterNonWord) return true; // if nameArg=='A' then subst=='A::Z' or 'S<A>' or 'Z::A' should return true, but 'AA::ZZ' or 'BAH' should not match
4729+
if (beforeNonWord && afterNonWord)
4730+
{
4731+
return true; // if nameArg=='A' then subst=='A::Z' or 'S<A>' or 'Z::A' should return true, but 'AA::ZZ' or 'BAH' should not match
4732+
}
47234733
pp=ii+static_cast<int>(nameArg.length());
47244734
}
47254735
return false;
47264736
};
47274737
// replace formal argument with the actual argument of the instance
4728-
if (!hasRecursion(n,actArg.type))
4738+
AUTO_TRACE_ADD("result={} n={} type={} hasRecursion={}",result,n,actArg.type,hasRecursion(result,n,actArg.type));
4739+
if (!hasRecursion(result,n,actArg.type))
47294740
// the scope guard is to prevent recursive lockup for
47304741
// template<class A> class C : public<A::T>,
47314742
// where A::T would become A::T::T here,
@@ -4780,7 +4791,7 @@ QCString substituteTemplateArgumentsInString(
47804791
}
47814792
result+=name.substr(p);
47824793
result=result.simplifyWhiteSpace();
4783-
//printf("< substituteTemplateArgumentsInString result=%s\n", qPrint(result));
4794+
AUTO_TRACE_EXIT("result={}",result);
47844795
return result.stripWhiteSpace();
47854796
}
47864797

0 commit comments

Comments
 (0)