@@ -3797,3 +3797,78 @@ bool isUnreachableOperand(const Token *tok)
37973797
37983798 return false ;
37993799}
3800+
3801+ static bool unknownLeafValuesAreTemplateArgs (const Token *tok)
3802+ {
3803+ if (!tok)
3804+ return true ;
3805+
3806+ if (!tok->astOperand1 () && !tok->astOperand2 ())
3807+ return tok->isTemplateArg () || tok->hasKnownIntValue ();
3808+
3809+ return unknownLeafValuesAreTemplateArgs (tok->astOperand1 ())
3810+ && unknownLeafValuesAreTemplateArgs (tok->astOperand2 ());
3811+ }
3812+
3813+ static const Token *skipUnreachableIfBranch (const Token *tok)
3814+ {
3815+ const Token *condTok = tok->linkAt (-1 );
3816+ if (!condTok)
3817+ return tok;
3818+
3819+ if (!Token::simpleMatch (condTok->tokAt (-1 ), " if" ) && !Token::simpleMatch (condTok->tokAt (-2 ), " if constexpr" ))
3820+ return tok;
3821+
3822+ condTok = condTok->astOperand2 ();
3823+ if (!condTok)
3824+ return tok;
3825+
3826+ if ((condTok->hasKnownIntValue () && condTok->getKnownIntValue () == 0 )
3827+ || (unknownLeafValuesAreTemplateArgs (condTok) && condTok->getValue (0 ))) {
3828+ tok = tok->link ();
3829+ }
3830+
3831+ return tok;
3832+ }
3833+
3834+ static const Token *skipUnreachableElseBranch (const Token *tok)
3835+ {
3836+ if (!Token::simpleMatch (tok->tokAt (-2 ), " } else {" ))
3837+ return tok;
3838+
3839+ const Token *condTok = tok->linkAt (-2 );
3840+ if (!condTok)
3841+ return tok;
3842+
3843+ condTok = condTok->linkAt (-1 );
3844+ if (!condTok)
3845+ return tok;
3846+
3847+ if (!Token::simpleMatch (condTok->tokAt (-1 ), " if (" ) && !Token::simpleMatch (condTok->tokAt (-2 ), " if constexpr (" ))
3848+ return tok;
3849+
3850+ condTok = condTok->astOperand2 ();
3851+
3852+ if ((condTok->hasKnownIntValue () && condTok->getKnownIntValue () != 0 )
3853+ || (unknownLeafValuesAreTemplateArgs (condTok) && condTok->getValueNE (0 ))) {
3854+ tok = tok->link ();
3855+ }
3856+
3857+ return tok;
3858+ }
3859+
3860+ const Token *skipUnreachableBranch (const Token *tok)
3861+ {
3862+ if (!Token::simpleMatch (tok, " {" ))
3863+ return tok;
3864+
3865+ if (tok->scope ()->type == Scope::ScopeType::eIf) {
3866+ return skipUnreachableIfBranch (tok);
3867+ }
3868+
3869+ if (tok->scope ()->type == Scope::ScopeType::eElse) {
3870+ return skipUnreachableElseBranch (tok);
3871+ }
3872+
3873+ return tok;
3874+ }
0 commit comments