/* $NetBSD: opt_badp.c,v 1.16 2023/06/27 04:41:23 rillig Exp $ */

/*
* Tests for the options '-badp' and '-nbadp'.
*
* The option '-badp' forces a blank line between the first set of declarations
* in a function and the next comment or statement. It produces a blank line
* even if there are no declarations.
*/


/* An empty function body does not need a blank line. */
//indent input
void
empty(void)
{
}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/* If an empty function body already has a blank line, it is kept. */
//indent input
void
blank(void)
{

}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/*
* If a function body has only declarations (doesn't occur in practice), it
* does not need an empty line.
*/
//indent input
void
declaration(void)
{
       int             decl;
}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/*
* A function body without declarations gets an empty line above the first
* statement.
*/
//indent input
void
statement(void)
{
       stmt();
}
//indent end

//indent run -badp
void
statement(void)
{

       stmt();
}
//indent end

//indent run-equals-input -nbadp


/*
* A function body with a declaration and a statement gets a blank line between
* those.
*/
//indent input
void
declaration_statement(void)
{
       int             decl;
       stmt();
}
//indent end

//indent run -badp
void
declaration_statement(void)
{
       int             decl;

       stmt();
}
//indent end

//indent run-equals-input -nbadp


/* If there already is a blank line in the right place, it is kept. */
//indent input
static void
declaration_blank_statement(void)
{
       int             decl;

       stmt();
}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/* Additional blank lines are kept. To remove them, see the '-sob' option. */
//indent input
static void
declaration_blank_blank_statement(void)
{
       int             decl;



       stmt();
}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/*
* The blank line is only inserted at the top of a function body, not in nested
* block statements.
*/
//indent input
static void
nested(void)
{
       {
               int             decl;
               stmt();
       }
}
//indent end

//indent run -badp
static void
nested(void)
{

       {
               int             decl;
               stmt();
       }
}
//indent end

//indent run-equals-input -nbadp


/*
* A struct declaration or an initializer are not function bodies, so don't
* add a blank line after them.
*/
//indent input
struct {
       int member[2];
} s = {
       {
               0,
               0,
       }
};
//indent end

//indent run-equals-input -di0 -badp

//indent run-equals-input -di0 -nbadp


/* Single-line function definitions must be handled correctly as well. */
//indent input
void f(void) { int decl; stmt; }
//indent end

//indent run -badp
void
f(void)
{
       int             decl;

       stmt;
}
//indent end

//indent run -nfbs -badp
void
f(void) {
       int             decl;

       stmt;
}
//indent end


/* The '}' of an initializer does not end a block. */
//indent input
void
f(void)
{
       int decl1[2][2] = {
               {1, 2},
               {3, 4},
       };
       int decl2 = 5;
       stmt;
}
//indent end

//indent run -di0 -badp
void
f(void)
{
       int decl1[2][2] = {
               {1, 2},
               {3, 4},
       };
       int decl2 = 5;

       stmt;
}
//indent end


/*
* Due to its limited lookahead, indent cannot know whether the comment is
* followed by a declaration or a statement, so it assumes that the comment is
* part of the declaration block.
*/
//indent input
void f(void) {
       int             decl1;
       /* comment */
       int             decl2;
       stmt;
}
//indent end

//indent run -badp
void
f(void)
{
       int             decl1;
       /* comment */
       int             decl2;

       stmt;
}
//indent end


/* Combining -bad and -badp only adds a single blank line. */
//indent input
void f(void) { int decl; stmt1; stmt2; }
//indent end

//indent run -bad -badp
void
f(void)
{
       int             decl;

       stmt1;
       stmt2;
}
//indent end