@@ -3797,3 +3797,78 @@ bool isUnreachableOperand(const Token *tok)
3797
3797
3798
3798
return false ;
3799
3799
}
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