glsl_analyzer
glsl_analyzer copied to clipboard
Parser crash in incomplete initializer lists
Hi, hope you're doing well!
Stumbled upon this during refactoring of some code, here's a repro:
#version 450 core
struct S {
float value;
};
void main() {
const S s = {
const float dummy = 0.0;
}
Version v1.5.1. Below is the output from a dry --parse-file
run, maybe that gives you a hint without having to test this yourself.
glsl_analyzer --parse-file src/shaders/test.glsl
thread 9939 panic: parser ran out of fuel (infinite loop?): parse.Tag.keyword_const
/home/automatic/projects/glsl_analyzer/src/parse.zig:0:17: 0x109f54e in infixExpressionOptImpl (glsl_analyzer)
/home/automatic/projects/glsl_analyzer/src/parse.zig:1053:34: 0x1086acb in constantExpressionOpt (glsl_analyzer)
return infixExpressionOptImpl(p, .eof);
^
/home/automatic/projects/glsl_analyzer/src/parse.zig:989:31: 0x1094cf9 in assignmentExpressionOpt (glsl_analyzer)
if (!constantExpressionOpt(p)) return false;
^
/home/automatic/projects/glsl_analyzer/src/parse.zig:984:33: 0x107d2e4 in initializer (glsl_analyzer)
if (!assignmentExpressionOpt(p)) p.emitError("expected an expression");
^
/home/automatic/projects/glsl_analyzer/src/parse.zig:720:24: 0x107d270 in initializer (glsl_analyzer)
initializer(p);
^
/home/automatic/projects/glsl_analyzer/src/parse.zig:943:34: 0x106099e in variableDeclarationSuffix (glsl_analyzer)
if (p.eat(.@"=")) initializer(p);
^
/home/automatic/projects/glsl_analyzer/src/parse.zig:938:30: 0x1087391 in simpleStatement (glsl_analyzer)
variableDeclarationSuffix(p, m_var);
^
/home/automatic/projects/glsl_analyzer/src/parse.zig:879:41: 0x107cb51 in statement (glsl_analyzer)
const kind = simpleStatement(p);
^
/home/automatic/projects/glsl_analyzer/src/parse.zig:752:22: 0x106078c in block (glsl_analyzer)
statement(p);
^
/home/automatic/projects/glsl_analyzer/src/parse.zig:697:26: 0x102c395 in parse (glsl_analyzer)
block(p);
^
/home/automatic/projects/glsl_analyzer/src/main.zig:64:35: 0x1050bf5 in main (glsl_analyzer)
var tree = try parse.parse(allocator, source, .{ .diagnostics = &diagnostics });
^
/opt/zig/zig-linux-x86_64-0.13.0/lib/std/start.zig:524:37: 0x1057ae5 in main (glsl_analyzer)
const result = root.main() catch |err| {
^
../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f2a21423a8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
../csu/libc-start.c:360:3: 0x7f2a21423b48 in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
???:?:?: 0x102a194 in ??? (???)
???:?:?: 0x0 in ??? (???)
Aborted (core dumped)