<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/77125>77125</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
             clang::html::HighlightMacros() causing ICE? ("Top level include stack isn't our primary lexer?")
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          SergeiYLarin
      </td>
    </tr>
</table>

<pre>
    Hi everyone,

I seem to run into ICE with SA html report creation for specific macros: __has_include and __has_include_next(). The issue seems to be the use of isInPrimaryFile() when parsing without Lexer available (invoke Preprocessor::Lex from SA) Here is the relevant part of the call stack:

clang/lib/Lex/PPLexerChange.cpp:41: bool clang::Preprocessor::isInPrimaryFile() const: Assertion `IsFileLexer(IncludeMacroStack[0]) && “Top level include stack isn’t our primary lexer?”’ failed.

#4 0x0 in clang::Preprocessor::isInPrimaryFile (this=0xe6f3dd8) at /repo/llvm/clang/lib/Lex/PPLexerChange.cpp:40
#5 0x0 in clang::Preprocessor::getIncludeNextStart (this=0xe6f3dd8, IncludeNextTok=…) at /repo/llvm/clang/lib/Lex/PPDirectives.cpp:1929
#6 0x0 in clang::Preprocessor::EvaluateHasIncludeNext (this=0xe6f3dd8, Tok=…, II=0xe6f6b48) at /repo/llvm/clang/lib/Lex/PPMacroExpansion.cpp:1285
#7 0x0 in clang::Preprocessor::ExpandBuiltinMacro (this=0xe6f3dd8, Tok=…) at /repo/llvm/clang/lib/Lex/PPMacroExpansion.cpp:1810
#8 0x0 in clang::Preprocessor::HandleMacroExpandedIdentifier (this=0xe6f3dd8, Identifier=…, M=…) at /repo/llvm/clang/lib/Lex/PPMacroExpansion.cpp:503
#9 0x0 in clang::Preprocessor::HandleIdentifier (this=0xe6f3dd8, Identifier=…) at /repo/llvm/clang/lib/Lex/Preprocessor.cpp:825
#10 0x0 in clang::TokenLexer::Lex (this=0xe7d7a10, Tok=…) at /repo/llvm/clang/lib/Lex/TokenLexer.cpp:717
#11 0x0 in clang::Preprocessor::Lex (this=0xe6f3dd8, Result=…) at /repo/llvm/clang/lib/Lex/Preprocessor.cpp:889
#12 0x0 in clang::html::HighlightMacros (R=…, FID=…, PP=…) at /repo/llvm/clang/lib/Rewrite/HTMLRewrite.cpp:696
#13 0x0 in (anonymous namespace)::HTMLDiagnostics::RewriteFile (this=0xe69c9d0, R=…, path=…, FID=…) at /repo/llvm/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp:882

The .cpp that reproduces it (for me) is here:

bin/clang -cc1 -analyze -analyzer-checker=core -analyzer-output html foo.cpp

#if 0
#elif 1
#if 0
#if __has_include_next(<stdio.h>)
#endif
#endif
#endif

class class_1 {
private:
void fun_1(char* var_1);
public:
int fun_2();
};

void *memset(void *, int, int) ;

void class_1::fun_1(char* var_1) {
unsigned int i = 0;
for (i = 16; var_1[i] != 0; i++)
var_1[i - 16] = var_1[i];
}

int class_1::fun_2() {
unsigned char var_2[100];
char var_3[300];

fun_1(var_3);
memset(var_2, 0, 100);

return 0;
}

SA warning expected:
clang_sa_warning: The left operand of ‘!=’ is a garbage value [core.UndefinedBinaryOperatorResult]

Any comments on whether Preprocessor::EvaluateHasIncludeNext needs fixing or the top level invocation (html::HighlightMacros) needs adjustment very much appreciated!

Sergei Larin
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV19vuzoS_TTuy6gRmBDgIQ_506iR-tutfu0-7FPlmCH4FmxkmzTdT7-yIZC26W5675UqGuzx-JzjwTPDjBF7iTgn8ZLE6xvW2lLp-RPqPYp_PzAt5M1O5e_zewF4QP2uJBK6IsGaBIvuuQWDWINVoFsJQloF29UdvAlbwtMCSltXoLFR2gLXyKxQEgqlwTTIRSE41IxrZUi0gJeXkpkXIXnV5ghM5h9HXiQeLaEpodkEnksEYUyLfnvj9t8h2BKhNQiqAGG28lGLmun3jaiwWwdvJUpomDZC7j1G1Vp4wCNqYAcmKrarEAhNhTyoV4RHjY1WHI1RmkQLEi0e8AiFVjU8LZy_e9QOh99YY4UHJq3zbx0EN8hZVYGxjL-69We68YrJPaGbSuwI3TzgkdDN46OHsiqZ3OOENw2JFtPQSbNTqoJuiYfxFdhlvlxJY52DhTGovfhkFmyNM_F7EZpuO3l_uXN48kjjZUDitVtP6IzQGZA7StKAZKtn1UCFB6zgdEyeGwgjTzaZBdVqaDosUPldos1pej3YQcFEhfnkXBVCoykExwCE_BFdd2a2FIZE6-CIsyLKc8-fWSB04-LPSV0dakI3VysfDJjiqzDt0fZa_gOP9sm6MLiIawVnds_qlUQnVRazn6FeC43cigOaHnSY0WyAPbsK9t2BVS2zeM_MGazvkH-Bu4Lt9mQ0201_KLuPurtjw6QRSp5I0DQeSCTXkXAu8mUrKiukd3o1gb8ONw3HUEmvgnvPZF7h6C3HfJujtKIQqL8NmsHi8wn8-psZxUE0EMp-QOjPc_gB5LO9e7gpHcMlDC7gfVavKLv7brjFPwBM8oSFwV8Mj3GXHlcSJiOu8CodvyAbpfuNpq3s3ylbOl4VIb0AzyXv_njFvqzEvrQ-XIyD-PtzEG62689Dj48_h_sb37SwSOjm_vnXQ__WI55lsxFxdEJMaMqkku-1ag1IVqNpGEdCsx7786-HtWB7qYwV3HSDvd8LuSPjWe4j4QvBhtny_5K-huKTZVbwhWTV-39cCt6slD4RPkM6HBM9T5Gu8nEzYEtmwZ9q3nI0IPyd7Wqr2pF3ZUmJGj_VHTshT3jglvMQblmHY_ihb3mJ_NV_oVzp8wnV2qa1XVFXKOUBfszeooDxLsRKFBBenhPFN9VdtDI2F2pSkuiOnCUzlLkorng7VVfGgH--hECSZTfcaHFgdpTkoEQORStfQkJTXjJN6AIOTLv3jESnVe2uEnxYJKT1a2hXYw1mJFmPv0f3hC5qrA06cqcBFzlC2uFfBpdW9vC7gP0O5Uiulb6Yz51LEECiNQSDWxcWrq71w-GMRMveQ7wUJF4DoeFpAQhCl_6vF38whFu31FlH6w_LP2hwRsMh-cKi1-0CcMfN-6UkXoZBcO55mItIvIw-zvUUe4U6o7ODGeX3rukK_PftNjg_Pv_UaFstz4T7xOhpAW9MS9c-4LFBbjEfAsN_VC-GvfQWru52X2uFhQXVoHYtjSqGajrtRB8LYmGAwZ7pHdsjuKoMgcRL9w1O_iVzLITEfCkk0-__dN6s0n1OiD9gXMh34KquUVoDSrqmx5aoL3Qz35R-EjE3UIijo6m0b2TsWeV_ULxr5AhNv80R7og7Ryz_ozXWwQHXQ0Ld8hJY02jkgjkBafhBYt99Qtd95vMoz6KM3eA8TILpNA2mSXBTzukuwHga72g040G2m0UpRrTgRYK8yIM4vBFzGtBpEAZxmE6TaTpJMlakUZhmYZEUdBaSaYA1E9XEXdETpfc3vp-cJ0lI45uK7bAyvi-mtL-9qWuR9dzZ3-7avSHToBLGmtGDFbbC-VUp9NSgsdb3otvVHYk24Efp_-qyaPJNf0UpodlNq6t5aW3j0xzdELrZC1u2uwlX9ZiOPIVGqz-QW0I3nrghdOO5_zcAAP__Pl_eSQ">