11.5Srillig/* $NetBSD: psym_decl.c,v 1.5 2023/06/14 09:31:05 rillig Exp $ */
21.1Srillig
31.1Srillig/*
41.1Srillig * Tests for the parser symbol psym_decl, which represents a declaration.
51.1Srillig *
61.1Srillig * Since C99, declarations and statements can be mixed in blocks.
71.1Srillig *
81.5Srillig * In C, a label can be followed by a statement but not by a declaration.
91.4Srillig *
101.4Srillig * Indent distinguishes global and local declarations.
111.4Srillig *
121.4Srillig * Declarations can be for functions or for variables.
131.1Srillig */
141.1Srillig
151.3Srillig//indent input
161.4Srilligint global_var;
171.4Srilligint global_array = [1,2,3,4];
181.4Srilligint global_array = [
191.4Srillig1
201.4Srillig,2,
211.4Srillig3,
221.4Srillig4,
231.4Srillig];
241.3Srillig//indent end
251.1Srillig
261.4Srillig//indent run -di0
271.4Srilligint global_var;
281.4Srilligint global_array = [1, 2, 3, 4];
291.4Srilligint global_array = [
301.4Srillig		    1
311.4Srillig		    ,2,
321.4Srillig		    3,
331.4Srillig		    4,
341.4Srillig];
351.4Srillig//indent end
361.5Srillig
371.5Srillig
381.5Srillig// Declarations can be nested.
391.5Srillig//indent input
401.5Srilligstruct level_1 {
411.5Srillig	union level_2 {
421.5Srillig		enum level_3 {
431.5Srillig			level_3_c_1,
441.5Srillig			level_3_c_2,
451.5Srillig		}		level_3;
461.5Srillig	}		level_2;
471.5Srillig} level_1;
481.5Srillig//indent end
491.5Srillig
501.5Srillig// The outermost declarator 'level_1' is indented as a global variable.
511.5Srillig// The inner declarators 'level_2' and 'level_3' are indented as local
521.5Srillig// variables.
531.5Srillig// XXX: This is inconsistent, as in practice, struct members are usually
541.5Srillig// aligned, while local variables aren't.
551.5Srillig//indent run-equals-input -ldi0
56