changeset 16865:d615cc95089c v8.1.1434

patch 8.1.1434: test 3 is old style commit https://github.com/vim/vim/commit/1ab74a5af36933f1c3023a910af20280bb79bd6c Author: Bram Moolenaar <Bram@vim.org> Date: Fri May 31 20:02:53 2019 +0200 patch 8.1.1434: test 3 is old style Problem: Test 3 is old style. Solution: Turn into a new style test. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/4460)
author Bram Moolenaar <Bram@vim.org>
date Fri, 31 May 2019 20:15:05 +0200
parents 625dec2f1b1b
children beb556717395
files src/Makefile src/testdir/Make_all.mak src/testdir/Make_vms.mms src/testdir/test3.in src/testdir/test3.ok src/testdir/test_cindent.vim src/version.c
diffstat 7 files changed, 5127 insertions(+), 4460 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile
+++ b/src/Makefile
@@ -2181,7 +2181,6 @@ test_libvterm:
 # These do not depend on the executable, compile it when needed.
 test1 \
 	test_eval \
-	test3 \
 	test39 \
 	test42 test44 test48 test49 \
 	test52 test59 \
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -13,7 +13,6 @@ SCRIPTS_FIRST = \
 
 # Tests that run on all systems.
 SCRIPTS_ALL = \
-	test3.out \
 	test39.out \
 	test42.out \
 	test44.out \
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -73,7 +73,7 @@ VIMPROG = <->vim.exe
 
 .SUFFIXES : .out .in
 
-SCRIPT = test1.out test3.out \
+SCRIPT = test1.out \
        test39.out \
        test42.out test44.out test48.out test49.out \
        test64.out test69.out \
deleted file mode 100644
--- a/src/testdir/test3.in
+++ /dev/null
@@ -1,2354 +0,0 @@
-/* vim: set cin ts=4 sw=4 : */
-
-Test for 'cindent'.
-For new tests, consider putting them in test_cindent.vim.
-
-STARTTEST
-:so small.vim
-:set nocompatible viminfo+=nviminfo modeline
-:edit                " read modeline
-/start of AUTO
-=/end of AUTO
-ENDTEST
-
-/* start of AUTO matically checked vim: set ts=4 : */
-{
-	if (test)
-		cmd1;
-	cmd2;
-}
-
-{
-	if (test)
-		cmd1;
-	else
-		cmd2;
-}
-
-{
-	if (test)
-	{
-		cmd1;
-		cmd2;
-	}
-}
-
-{
-	if (test)
-	{
-		cmd1;
-		else
-	}
-}
-
-{
-	while (this)
-		if (test)
-			cmd1;
-	cmd2;
-}
-
-{
-	while (this)
-		if (test)
-			cmd1;
-		else
-			cmd2;
-}
-
-{
-	if (test)
-	{
-		cmd;
-	}
-
-	if (test)
-		cmd;
-}
-
-{
-	if (test) {
-		cmd;
-	}
-
-	if (test) cmd;
-}
-
-{
-	cmd1;
-	for (blah)
-		while (this)
-			if (test)
-				cmd2;
-	cmd3;
-}
-
-{
-	cmd1;
-	for (blah)
-		while (this)
-			if (test)
-				cmd2;
-	cmd3;
-
-	if (test)
-	{
-		cmd1;
-		cmd2;
-		cmd3;
-	}
-}
-
-
-/* Test for 'cindent' do/while mixed with if/else: */
-
-{
-	do
-		if (asdf)
-			asdfasd;
-	while (cond);
-
-	do
-		if (asdf)
-			while (asdf)
-				asdf;
-	while (asdf);
-}
-
-/* Test for 'cindent' with two ) on a continuation line */
-{
-	if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
-			aal;sdkjf  ( ;asldfkja;sldfk
-					al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
-		line up here;
-}
-
-
-/* C++ tests: */
-
-// foo()		these three lines should remain in column 0
-// {
-// }
-
-/* Test for continuation and unterminated lines: */
-{
-	i = 99 + 14325 +
-		21345 +
-		21345 +
-		21345 + ( 21345 +
-				21345) +
-		2345 +
-		1234;
-	c = 1;
-}
-
-/*
-   testje for indent with empty line
-
-   here */
-
-{
-	if (testing &&
-			not a joke ||
-			line up here)
-		hay;
-	if (testing &&
-			(not a joke || testing
-			)line up here)
-		hay;
-	if (testing &&
-			(not a joke || testing
-			 line up here))
-		hay;
-}
-
-
-{
-	switch (c)
-	{
-		case xx:
-			do
-				if (asdf)
-					do
-						asdfasdf;
-					while (asdf);
-				else
-					asdfasdf;
-			while (cond);
-		case yy:
-		case xx:
-		case zz:
-			testing;
-	}
-}
-
-{
-	if (cond) {
-		foo;
-	}
-	else
-	{
-		bar;
-	}
-}
-
-{
-	if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
-			alsdkfj (asldk;fj
-					awith cino=(0 ;lf this one goes to below the paren with ==
-							;laksjfd ;lsakdjf ;alskdf asd)
-					asdfasdf;)))
-		asdfasdf;
-}
-
-	int
-func(a, b)
-	int a;
-	int c;
-{
-	if (c1 && (c2 ||
-			c3))
-		foo;
-	if (c1 &&
-			(c2 || c3)
-	   )
-}
-
-{
-	while (asd)
-	{
-		if (asdf)
-			if (test)
-				if (that)
-				{
-					if (asdf)
-						do
-							cdasd;
-						while (as
-								df);
-				}
-				else
-					if (asdf)
-						asdf;
-					else
-						asdf;
-		asdf;
-	}
-}
-
-{
-	s = "/*"; b = ';'
-		s = "/*"; b = ';';
-	a = b;
-}
-
-{
-	switch (a)
-	{
-		case a:
-			switch (t)
-			{
-				case 1:
-					cmd;
-					break;
-				case 2:
-					cmd;
-					break;
-			}
-			cmd;
-			break;
-		case b:
-			{
-				int i;
-				cmd;
-			}
-			break;
-		case c: {
-					int i;
-					cmd;
-				}
-		case d: if (cond &&
-						test) {		/* this line doesn't work right */
-					int i;
-					cmd;
-				}
-				break;
-	}
-}
-
-{
-	if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
-			(bp_to->b_p_initialized ||
-			 (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
-		return;
-label :
-	asdf = asdf ?
-		asdf : asdf;
-	asdf = asdf ?
-		asdf: asdf;
-}
-
-/* Special Comments	: This function has the added complexity (compared  */
-/*					: to addtolist) of having to check for a detail     */
-/*					: texture and add that to the list first.	 	    */
-
-char *(array[100]) = {
-	"testje",
-	"foo",
-	"bar",
-}
-
-enum soppie
-{
-yes = 0,
-no,
-maybe
-};
-
-typedef enum soppie
-{
-yes = 0,
-no,
-maybe
-};
-
-static enum
-{
-yes = 0,
-no,
-maybe
-} soppie;
-
-public static enum
-{
-yes = 0,
-no,
-maybe
-} soppie;
-
-static private enum
-{
-yes = 0,
-no,
-maybe
-} soppie;
-
-{
-	int a,
-		b;
-}
-
-{
-	struct Type
-	{
-		int i;
-		char *str;
-	} var[] =
-	{
-		0, "zero",
-		1, "one",
-		2, "two",
-		3, "three"
-	};
-
-	float matrix[3][3] =
-	{
-		{
-			0,
-			1,
-			2
-		},
-		{
-			3,
-			4,
-			5
-		},
-		{
-			6,
-			7,
-			8
-		}
-	};
-}
-
-{
-	/* blah ( blah */
-	/* where does this go? */
-
-	/* blah ( blah */
-	cmd;
-
-	func(arg1,
-			/* comment */
-			arg2);
-	a;
-	{
-		b;
-		{
-			c; /* Hey, NOW it indents?! */
-		}
-	}
-
-	{
-		func(arg1,
-				arg2,
-				arg3);
-		/* Hey, what am I doing here?  Is this coz of the ","? */
-	}
-}
-
-main ()
-{
-	if (cond)
-	{
-		a = b;
-	}
-	if (cond) {
-		a = c;
-	}
-	if (cond)
-		a = d;
-	return;
-}
-
-{
-	case 2: if (asdf &&
-					asdfasdf)
-				aasdf;
-			a = 9;
-	case 3: if (asdf)
-				aasdf;
-			a = 9;
-	case 4:    x = 1;
-			   y = 2;
-
-label:	if (asdf)
-			here;
-
-label:  if (asdf &&
-				asdfasdf)
-		{
-		}
-
-label:  if (asdf &&
-				asdfasdf) {
-			there;
-		}
-
-label:  if (asdf &&
-				asdfasdf)
-			there;
-}
-
-{
-	/*
-	   hello with ":set comments= cino=c5"
-	 */
-
-	/*
-	   hello with ":set comments= cino="
-	 */
-}
-
-
-{
-	if (a < b) {
-		a = a + 1;
-	} else
-		a = a + 2;
-
-	if (a)
-		do {
-			testing;
-		} while (asdfasdf);
-	a = b + 1;
-	asdfasdf
-}
-
-{
-for ( int i = 0;
-	i < 10; i++ )
-{
-}
-	i = 0;
-}
-
-class bob
-{
-	int foo() {return 1;}
-		int bar;
-}
-
-main()
-{
-while(1)
-if (foo)
-{
-bar;
-}
-else {
-asdf;
-}
-misplacedline;
-}
-
-{
-	if (clipboard.state == SELECT_DONE
-	&& ((row == clipboard.start.lnum
-	&& col >= clipboard.start.col)
-	|| row > clipboard.start.lnum))
-}
-
-{
-if (1) {i += 4;}
-where_am_i;
-return 0;
-}
-
-{
-{
-} // sdf(asdf
-if (asdf)
-asd;
-}
-
-{
-label1:
-label2:
-}
-
-{
-int fooRet = foo(pBar1, false /*fKB*/,
-	true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
-f() {
-for ( i = 0;
-	i < m;
-	/* c */ i++ ) {
-a = b;
-}
-}
-}
-
-{
-	f1(/*comment*/);
-	f2();
-}
-
-{
-do {
-if (foo) {
-} else
-;
-} while (foo);
-foo();	// was wrong
-}
-
-int x;	    // no extra indent because of the ;
-void func()
-{
-}
-
-char *tab[] = {"aaa",
-	"};", /* }; */ NULL}
-	int indented;
-{}
-
-char *a[] = {"aaa", "bbb",
-	"ccc", NULL};
-// here
-
-char *tab[] = {"aaa",
-	"xx", /* xx */};    /* asdf */
-int not_indented;
-
-{
-	do {
-		switch (bla)
-		{
-			case 1: if (foo)
-						bar;
-		}
-	} while (boo);
-					wrong;
-}
-
-int	foo,
-	bar;
-int foo;
-
-#if defined(foo) \
-	&& defined(bar)
-char * xx = "asdf\
-	foo\
-	bor";
-int x;
-
-char    *foo = "asdf\
-	asdf\
-	asdf",
-	*bar;
-
-void f()
-{
-#if defined(foo) \
-	&& defined(bar)
-char    *foo = "asdf\
-	asdf\
-	asdf",
-	*bar;
-	{
-	int i;
-char    *foo = "asdf\
-	asdf\
-	asdf",
-	*bar;
-	}
-#endif
-}
-#endif
-
-int y;		// comment
-		// comment
-
-	// comment
-
-{
-	Constructor(int a,
-			int b )  : BaseClass(a)
-	{
-	}
-}
-
-void foo()
-{
-	char one,
-	two;
-	struct bla piet,
-	jan;
-	enum foo kees,
-	jannie;
-	static unsigned sdf,
-	krap;
-	unsigned int piet,
-	jan;
-	int
-	kees,
-	jan;
-}
-
-{
-	t(int f,
-			int d);		// )
-	d();
-}
-
-Constructor::Constructor(int a,
-                         int b 
-                        )  : 
-   BaseClass(a,
-             b,
-             c),
-   mMember(b),
-{
-}
-
-Constructor::Constructor(int a,
-                         int b )  : 
-   BaseClass(a)
-{
-}
-
-Constructor::Constructor(int a,
-                         int b ) /*x*/ : /*x*/ BaseClass(a),
-                                               member(b)
-{
-}
-
-A::A(int a, int b)
-: aa(a),
-bb(b),
-cc(c)
-{
-}
-
-class CAbc :
-   public BaseClass1,
-   protected BaseClass2
-{
-   int Test() { return FALSE; }
-   int Test1() { return TRUE; }
-
-   CAbc(int a, int b )  : 
-      BaseClass(a)
-   { 
-      switch(xxx)
-      {
-         case abc:
-            asdf();
-            break;
-
-         case 999:
-            baer();
-            break;
-      }
-   }
-
-public: // <-- this was incoreectly indented before!!
-   void testfall();
-protected:
-   void testfall();
-};
-
-class CAbc : public BaseClass1,
-             protected BaseClass2
-{
-};
-
-static struct
-{
-    int a;
-    int b;
-} variable[COUNT] =
-{
-    {
-        123,
-        456
-    },
-	{
-        123,
-        456
-    }
-};
-
-static struct
-{
-    int a;
-    int b;
-} variable[COUNT] =
-{
-    { 123, 456 },
-	{ 123, 456 }
-};
-
-void asdf()		/* ind_maxparen may cause trouble here */
-{
-	if ((0
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1)) break;
-}
-
-foo()
-{
-	a = cond ? foo() : asdf
-					   + asdf;
-
-	a = cond ?
-		foo() : asdf
-				+ asdf;
-}
-
-int  main(void)
-{
-	if (a)
-		if (b)
-			2;
-		else 3;
-	next_line_of_code();
-}
-
-barry()
-{
-	Foo::Foo (int one,
-			int two)
-		: something(4)
-	{}
-}
-
-barry()
-{
-	Foo::Foo (int one, int two)
-		: something(4)
-	{}
-}
-
-Constructor::Constructor(int a,
-		int b 
-		)  : 
-	BaseClass(a,
-			b,
-			c),
-	mMember(b)
-{
-}
-       int main ()
-       {
-	 if (lala)
-	   do
-	     ++(*lolo);
-	   while (lili
-		  && lele);
-	   lulu;
-       }
-
-int main ()
-{
-switch (c)
-{
-case 'c': if (cond)
-{
-}
-}
-}
-
-main()
-{
-	(void) MyFancyFuasdfadsfnction(
-			argument);
-}
-
-main()
-{
-	char	foo[] = "/*";
-	/* as
-	df */
-		hello
-}
-
-/* valid namespaces with normal indent */
-namespace
-{
-{
-  111111111111;
-}
-}
-namespace /* test */
-{
-  11111111111111111;
-}
-namespace // test
-{
-  111111111111111111;
-}
-namespace
-{
-  111111111111111111;
-}
-namespace test
-{
-  111111111111111111;
-}
-namespace{
-  111111111111111111;
-}
-namespace test{
-  111111111111111111;
-}
-namespace {
-  111111111111111111;
-}
-namespace test {
-  111111111111111111;
-namespace test2 {
-  22222222222222222;
-}
-}
-
-/* invalid namespaces use block indent */
-namespace test test2 {
-  111111111111111111111;
-}
-namespace11111111111 {
-  111111111111;
-}
-namespace() {
-  1111111111111;
-}
-namespace()
-{
-  111111111111111111;
-}
-namespace test test2
-{
-  1111111111111111111;
-}
-namespace111111111
-{
-  111111111111111111;
-}
-
-void getstring() {
-/* Raw strings */
-const char* s = R"(
-  test {
-    # comment
-    field: 123
-  }
- )";
-     }
-
-void getstring() {
-const char* s = R"foo(
-  test {
-    # comment
-    field: 123
-  }
-    )foo";
-     }
-
-{
-int a[4] = {
-[0] = 0,
-[1] = 1,
-[2] = 2,
-[3] = 3,
-};
-}
-
-{
-a = b[2]
-+ 3;
-}
-
-{
-if (1)
-/* aaaaa
-* bbbbb
-*/
-a = 1;
-}
-
-void func()
-{
-switch (foo)
-{
-case (bar):
-if (baz())
-quux();
-break;
-case (shmoo):
-if (!bar)
-{
-}
-case (foo1):
-switch (bar)
-{
-case baz:
-baz_f();
-break;
-}
-break;
-default:
-baz();
-baz();
-break;
-}
-}
-
-/* end of AUTO */
-
-STARTTEST
-:set tw=0 noai fo=croq
-:let &wm = &columns - 20
-/serious/e
-a about life, the universe, and the rest
-ENDTEST
-
-{
-
-/* this is
- * a real serious important big
- * comment
- */
-	/* insert " about life, the universe, and the rest" after "serious" */
-}
-
-STARTTEST
-:set nocin
-/comments
-joabout life/happens
-jothere/below
-oline/this
-Ohello
-ENDTEST
-
-{
-	/*
-	 * Testing for comments, without 'cin' set
-	 */
-
-/*
-* what happens here?
-*/
-
-	/*
-	   the end of the comment, try inserting a line below */
-
-		/* how about
-		                this one */
-}
-
-STARTTEST
-:set cin
-/vec2
-==
-ENDTEST
-
-{
-    var = this + that + vec[0] * vec[0]
-				      + vec[1] * vec[1]
-					  + vec2[2] * vec[2];
-}
-
-STARTTEST
-:set cin
-:set cino=}4
-/testing1
-k2==/testing2
-k2==
-ENDTEST
-
-{
-		asdf asdflkajds f;
-	if (tes & ting) {
-		asdf asdf asdf ;
-		asdfa sdf asdf;
-		}
-	testing1;
-	if (tes & ting)
-	{
-		asdf asdf asdf ;
-		asdfa sdf asdf;
-		}
-	testing2;
-}
-
-STARTTEST
-:set cin
-:set cino=(0,)20
-/main
-=][
-ENDTEST
-
-main ( int first_par, /*
-                       * Comment for
-                       * first par
-                       */
-          int second_par /*
-                       * Comment for
-                       * second par
-                       */
-     )
-{
-	func( first_par, /*
-                      * Comment for
-                      * first par
-                      */
-    second_par /*
-                      * Comment for
-                      * second par
-                      */
-        );
-
-}
-
-STARTTEST
-:set cin
-:set cino=es,n0s
-/main
-=][
-ENDTEST
-
-main(void)
-{
-	/* Make sure that cino=X0s is not parsed like cino=Xs. */
-	if (cond)
-		foo();
-	else
-	{
-		bar();
-	}
-}
-
-STARTTEST
-:set cin
-:set cino=
-]]=][
-ENDTEST
-
-{
-	do
-	{
-		if ()
-		{
-			if ()
-				asdf;
-			else
-				asdf;
-		}
-	} while ();
-			cmd;		/* this should go under the } */
-}
-
-STARTTEST
-]]=][
-ENDTEST
-
-void f()
-{
-    if ( k() ) {
-        l();
-
-    } else { /* Start (two words) end */
-        m();
-    }
-
-    n();
-}
-
-STARTTEST
-:set cino={s,e-s
-]]=][
-ENDTEST
-
-void f()
-{
-    if ( k() )
-	{
-        l();
-    } else { /* Start (two words) end */
-        m();
-    }
-		n();	/* should be under the if () */
-}
-
-STARTTEST
-:set cino={s,fs
-]]=/ foo
-ENDTEST
-
-void bar(void)
-{
-	static array[2][2] =
-	{
-		{ 1, 2 },
-		{ 3, 4 },
-	}
-
-	while (a)
-	{
-		foo(&a);
-	}
-
-	{
-		int a;
-		{
-			a = a + 1;
-		}
-	}
-	b = a;
-	}
-
-void func(void)
-	{
-	a = 1;
-	{
-		b = 2;
-	}
-	c = 3;
-	d = 4;
-	}
-/* foo */
-
-STARTTEST
-:set cino=
-/while
-ohere
-ENDTEST
-
-a()
-{
-  do {
-    a = a +
-      a;
-  } while ( a );		/* add text under this line */
-    if ( a )
-      a;
-}
-
-STARTTEST
-:set cino= com=
-/comment
-olabel2: b();
label3 /* post */:
/* pre */ label4:
f(/*com*/);
if (/*com*/)
cmd();
-ENDTEST
-
-a()
-{
-label1:
-            /* hmm */
-            // comment
-}
-
-STARTTEST
-:set comments& comments^=s:/*,m:**,ex:*/
-/simple
-=5j
-ENDTEST
-
-/*
-  * A simple comment
-   */
-
-/*
-  ** A different comment
-   */
-
-STARTTEST
-:set cino=c0
-:set comments& comments-=s1:/* comments^=s0:/*
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-
-	/*********
-  A comment.
-*********/
-}
-
-STARTTEST
-:set cino=c0,C1
-:set comments& comments-=s1:/* comments^=s0:/*
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-
-	/*********
-  A comment.
-*********/
-}
-
-STARTTEST
-:set cino=
-]]=][
-ENDTEST
-
-void f()
-{
-	c = c1 &&
-	(
-	c2 ||
-	c3
-	) && c4;
-}
-
-STARTTEST
-:set cino=(s
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	c = c1 &&
-	(
-	c2 ||
-	c3
-	) && c4;
-}
-
-STARTTEST
-:set cino=(s,U1  
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	c = c1 &&
-	(
-	c2 ||
-	c3
-	) && c4;
-}
-
-STARTTEST
-:set cino=(0
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	if (   c1
-	&& (   c2
-	|| c3))
-	foo;
-}
-
-STARTTEST
-:set cino=(0,w1  
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	if (   c1
-	&& (   c2
-	|| c3))
-	foo;
-}
-
-STARTTEST
-:set cino=(s
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	c = c1 && (
-	c2 ||
-	c3
-	) && c4;
-	if (
-	c1 && c2
-	)
-	foo;
-}
-
-STARTTEST
-:set cino=(s,m1  
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	c = c1 && (
-	c2 ||
-	c3
-	) && c4;
-	if (
-	c1 && c2
-	)
-	foo;
-}
-
-STARTTEST
-:set cino=b1
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	switch (x)
-	{
-		case 1:
-			a = b;
-			break;
-		default:
-			a = 0;
-			break;
-	}
-}
-
-STARTTEST
-:set cino=(0,W5
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	invokeme(
-	argu,
-	ment);
-	invokeme(
-	argu,
-	ment
-	);
-	invokeme(argu,
-	ment
-	);
-}
-
-STARTTEST
-:set cino=/6
-2kdd]]=][
-ENDTEST
-
-void f()
-{
-	statement;
-		// comment 1
-	// comment 2
-}
-
-STARTTEST
-:set cino=
-2kdd]]/comment 1/+1
-==
-ENDTEST
-
-void f()
-{
-	statement;
-	   // comment 1
-	// comment 2
-}
-
-STARTTEST
-:set cino=g0
-2kdd]]=][
-ENDTEST
-
-class CAbc
-{
-   int Test() { return FALSE; }
-
-public: // comment
-   void testfall();
-protected:
-   void testfall();
-};
-
-STARTTEST
-:set cino=(0,gs,hs
-2kdd]]=][
-ENDTEST
-
-class Foo : public Bar
-{
-public:
-virtual void method1(void) = 0;
-virtual void method2(int arg1,
-int arg2,
-int arg3) = 0;
-};
-
-STARTTEST
-:set cino=+20
-2kdd]]=][
-ENDTEST
-
-	void
-foo()
-{
-	if (a)
-	{
-	} else
-		asdf;
-}
-
-STARTTEST
-:set cino=(0,W2s
-2kdd]]=][
-ENDTEST
-
-{
-   averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
-         asdasdf,
-         func(asdf,
-              asdfadsf),
-         asdfasdf
-         );
-
-   /* those are ugly, but consequent */
-
-   func()->asd(asdasdf,
-               averylongfunctionname(
-                     abc,
-                     dec)->averylongfunctionname(
-                           asdfadsf,
-                           asdfasdf,
-                           asdfasdf,
-                           ),
-               func(asdfadf,
-                    asdfasdf
-                   ),
-               asdasdf
-              );
-
-   averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
-               abc,
-               dec)->asdfasdfasdf(
-                     asdfadsf,
-                     asdfasdf,
-                     asdfasdf,
-                     ),
-         func(asdfadf,
-              asdfasdf),
-         asdasdf
-         );
-}
-
-STARTTEST
-:set cino=M1
-2kdd]]=][
-ENDTEST
-
-int main ()
-{
-	if (cond1 &&
-			cond2
-			)
-		foo;
-}
-
-STARTTEST
-:set cino=(0,ts
-2kdd2j=][
-ENDTEST
-
-void func(int a
-#if defined(FOO)
-		  , int b
-		  , int c
-#endif
-		 )
-{
-}
-
-STARTTEST
-:set cino=(0
-2kdd2j=][
-ENDTEST
-
-void
-func(int a
-#if defined(FOO)
-		  , int b
-		  , int c
-#endif
-		 )
-{
-}
-
-STARTTEST
-:set cino&
-2kdd2j=7][
-ENDTEST
-
-void func(void)
-{
-	if(x==y)
-		if(y==z)
-			foo=1;
-		else { bar=1;
-			baz=2;
-		}
-	printf("Foo!\n");
-}
-
-void func1(void)
-{
-	char* tab[] = {"foo", "bar",
-		"baz", "quux",
-			"this line used", "to be indented incorrectly"};
-	foo();
-}
-
-void func2(void)
-{
-	int tab[] =
-	{1, 2,
-		3, 4,
-		5, 6};
-
-		printf("This line used to be indented incorrectly.\n");
-}
-
-int foo[]
-#ifdef BAR
-
-= { 1, 2, 3,
-	4, 5, 6 }
-
-#endif
-;
-	int baz;
-
-void func3(void)
-{
-	int tab[] = {
-	1, 2,
-	3, 4,
-	5, 6};
-
-printf("Don't you dare indent this line incorrectly!\n");
-}
-
-void
-func4(a, b,
-		c)
-int a;
-int b;
-int c;
-{
-}
-
-void
-func5(
-		int a,
-		int b)
-{
-}
-
-void
-func6(
-		int a)
-{
-}
-
-STARTTEST
-:set cino&
-:set cino+=l1
-2kdd2j=][
-ENDTEST
-
-void func(void)
-{
-	int tab[] =
-	{
-		1, 2, 3,
-		4, 5, 6};
-
-	printf("Indent this line correctly!\n");
-
-	switch (foo)
-	{
-		case bar:
-			printf("bar");
-			break;
-		case baz: {
-			printf("baz");
-			break;
-		}
-		case quux:
-printf("But don't break the indentation of this instruction\n");
-break;
-	}
-}
-
-STARTTEST
-:set cino&
-2kdd2j=][
-ENDTEST
-
-void func(void)
-{
-	cout << "a"
-	<< "b"
-	<< ") :"
-	<< "c";
-}
-
-STARTTEST
-:set com=s1:/*,m:*,ex:*/
-]]3jofoo();
-ENDTEST
-
-void func(void)
-{
-	/*
-	 * This is a comment.
-	 */
-}
-
-STARTTEST
-:set cino&
-2kdd2j=][
-ENDTEST
-
-void func(void)
-{
-	for (int i = 0; i < 10; ++i)
-		if (i & 1) {
-			foo(1);
-		} else
-			foo(0);
-baz();
-}
-
-STARTTEST
-:set cino=k2s,(0
-2kdd3j=][
-ENDTEST
-
-void func(void)
-{
-	if (condition1
-	&& condition2)
-	action();
-	function(argument1
-	&& argument2);
-
-	if (c1 && (c2 ||
-	c3))
-	foo;
-	if (c1 &&
-	(c2 || c3))
-	{
-	}
-
-	if (   c1
-	&& (      c2
-	|| c3))
-	foo;
-	func( c1
-	&& (     c2
-	|| c3))
-	foo;
-}
-
-STARTTEST
-:set cino=k2s,(s
-2kdd3j=][
-ENDTEST
-
-void func(void)
-{
-	if (condition1
-	&& condition2)
-	action();
-	function(argument1
-	&& argument2);
-
-	if (c1 && (c2 ||
-	c3))
-	foo;
-	if (c1 &&
-	(c2 || c3))
-	{
-	}
-
-	if (   c1
-	&& (      c2
-	|| c3))
-	foo;
-	func(   c1
-	&& (      c2
-	|| c3))
-	foo;
-}
-
-STARTTEST
-:set cino=k2s,(s,U1
-2kdd3j=][
-ENDTEST
-
-void func(void)
-{
-	if (condition1
-	&& condition2)
-	action();
-	function(argument1
-	&& argument2);
-
-	if (c1 && (c2 ||
-	c3))
-	foo;
-	if (c1 &&
-	(c2 || c3))
-	{
-	}
-	if (c123456789
-	&& (c22345
-	|| c3))
-	printf("foo\n");
-
-	c = c1 &&
-	(
-	c2 ||
-	c3
-	) && c4;
-}
-
-STARTTEST
-:set cino=k2s,(0,W4
-2kdd3j=][
-ENDTEST
-
-void func(void)
-{
-	if (condition1
-	&& condition2)
-	action();
-	function(argument1
-	&& argument2);
-
-	if (c1 && (c2 ||
-	c3))
-	foo;
-	if (c1 &&
-	(c2 || c3))
-	{
-	}
-	if (c123456789
-	&& (c22345
-	|| c3))
-	printf("foo\n");
-
-	if (   c1
-	&& (   c2
-	|| c3))
-	foo;
-
-	a_long_line(
-	argument,
-	argument);
-	a_short_line(argument,
-	argument);
-}
-
-STARTTEST
-:set cino=k2s,u2
-2kdd3j=][
-ENDTEST
-
-void func(void)
-{
-	if (condition1
-	&& condition2)
-	action();
-	function(argument1
-	&& argument2);
-
-	if (c1 && (c2 ||
-	c3))
-	foo;
-	if (c1 &&
-	(c2 || c3))
-	{
-	}
-	if (c123456789
-	&& (c22345
-	|| c3))
-	printf("foo\n");
-}
-
-STARTTEST
-:set cino=k2s,(0,w1
-2kdd3j=][
-ENDTEST
-
-void func(void)
-{
-	if (condition1
-	&& condition2)
-	action();
-	function(argument1
-	&& argument2);
-
-	if (c1 && (c2 ||
-	c3))
-	foo;
-	if (c1 &&
-	(c2 || c3))
-	{
-	}
-	if (c123456789
-	&& (c22345
-	|| c3))
-	printf("foo\n");
-
-	if (   c1
-	&& (      c2
-	|| c3))
-	foo;
-	func(   c1
-	&& (      c2
-	|| c3))
-	foo;
-}
-
-STARTTEST
-:set cino=k2,(s
-2kdd3j=][
-ENDTEST
-
-void func(void)
-{
-	if (condition1
-	  && condition2)
-		action();
-	function(argument1
-		&& argument2);
-
-	if (c1 && (c2 ||
-		  c3))
-		foo;
-	if (c1 &&
-	  (c2 || c3))
-	{
-	}
-}
-
-STARTTEST
-:set cino=N-s
-/^NAMESPACESTART
-=/^NAMESPACEEND
-ENDTEST
-
-NAMESPACESTART
-/* valid namespaces with normal indent */
-namespace
-{
-   {
-	111111111111;
-}
-}
-namespace /* test */
-{
-  11111111111111111;
-}
-namespace // test
-{
-  111111111111111111;
-}
-namespace
-{
-  111111111111111111;
-}
-namespace test
-{
-  111111111111111111;
-}
-namespace test::cpp17
-{
-  111111111111111111;
-}
-namespace ::incorrectcpp17
-{
-  111111111111111111;
-}
-namespace test::incorrectcpp17::
-{
-  111111111111111111;
-}
-namespace test:incorrectcpp17
-{
-  111111111111111111;
-}
-namespace test:::incorrectcpp17
-{
-  111111111111111111;
-}
-namespace{
-  111111111111111111;
-}
-namespace test{
-  111111111111111111;
-}
-namespace {
-  111111111111111111;
-}
-namespace test {
-  111111111111111111;
-namespace test2 {
-  22222222222222222;
-}
-}
-
-/* invalid namespaces use block indent */
-namespace test test2 {
-  111111111111111111111;
-}
-namespace11111111111 {
-  111111111111;
-}
-namespace() {
-  1111111111111;
-}
-namespace()
-{
-  111111111111111111;
-}
-namespace test test2
-{
-  1111111111111111111;
-}
-namespace111111111
-{
-  111111111111111111;
-}
-NAMESPACEEND
-
-
-STARTTEST
-:set cino=j1,J1
-/^JSSTART
-=/^JSEND
-ENDTEST
-
-JSSTART
-var bar = {
-foo: {
-that: this,
-some: ok,
-},
-"bar":{
-a : 2,
-b: "123abc",
-x: 4,
-"y": 5
-}
-}
-JSEND
-
-STARTTEST
-:set cino=j1,J1
-/^JSSTART
-=/^JSEND
-ENDTEST
-
-JSSTART
-var foo = [
-1,
-2,
-3
-];
-JSEND
-
-STARTTEST
-:set cino=j1,J1
-/^JSSTART
-=/^JSEND
-ENDTEST
-
-JSSTART
-function bar() {
-var foo = [
-1,
-2,
-3
-];
-}
-JSEND
-
-STARTTEST
-:set cino=j1,J1
-/^JSSTART
-=/^JSEND
-ENDTEST
-
-JSSTART
-(function($){
-
-if (cond &&
-cond) {
-stmt;
-}
-window.something.left =
-(width - 50 + offset) + "px";
-var class_name='myclass';
-
-function private_method() {
-}
-
-var public_method={
-method: function(options,args){
-private_method();
-}
-}
-
-function init(options) {
-
-$(this).data(class_name+'_public',$.extend({},{
-foo: 'bar',
-bar: 2,
-foobar: [
-1,
-2,
-3
-],
-callback: function(){
-return true;
-}
-}, options||{}));
-}
-
-$.fn[class_name]=function() {
-
-var _arguments=arguments;
-return this.each(function(){
-
-var options=$(this).data(class_name+'_public');
-if (!options) {
-init.apply(this,_arguments);
-
-} else {
-var method=public_method[_arguments[0]];
-
-if (typeof(method)!='function') {
-console.log(class_name+' has no method "'+_arguments[0]+'"');
-return false;
-}
-_arguments[0]=options;
-method.apply(this,_arguments);
-}
-});
-}
-
-})(jQuery);
-JSEND
-
-STARTTEST
-:set cino=j1,J1
-/^JSSTART
-=/^JSEND
-ENDTEST
-
-JSSTART
-function init(options) {
-$(this).data(class_name+'_public',$.extend({},{
-foo: 'bar',
-bar: 2,
-foobar: [
-1,
-2,
-3
-],
-callback: function(){
-return true;
-}
-}, options||{}));
-}
-JSEND
-
-STARTTEST
-:set cino=j1,J1
-/^JSSTART
-=/^JSEND
-ENDTEST
-
-JSSTART
-(function($){
-function init(options) {
-$(this).data(class_name+'_public',$.extend({},{
-foo: 'bar',
-bar: 2,
-foobar: [
-1,
-2,
-3
-],
-callback: function(){
-return true;
-}
-}, options||{}));
-}
-})(jQuery);
-JSEND
-
-STARTTEST
-:set cino=j1,J1,+2
-/^JSSTART
-=/^JSEND
-ENDTEST
-
-JSSTART
-// Results of JavaScript indent
-// 1
-(function(){
-var a = [
-'a',
-'b',
-'c',
-'d',
-'e',
-'f',
-'g',
-'h',
-'i'
-];
-}())
-
-// 2
-(function(){
-var a = [
-0 +
-5 *
-9 *
-'a',
-'b',
-0 +
-5 *
-9 *
-'c',
-'d',
-'e',
-'f',
-'g',
-'h',
-'i'
-];
-}())
-
-// 3
-(function(){
-var a = [
-0 +
-// comment 1
-5 *
-/* comment 2 */
-9 *
-'a',
-'b',
-0 +
-5 *
-9 *
-'c',
-'d',
-'e',
-'f',
-'g',
-'h',
-'i'
-];
-}())
-
-// 4
-{
-var a = [
-0,
-1
-];
-var b;
-var c;
-}
-
-// 5
-{
-var a = [
-[
-0
-],
-2,
-3
-];
-}
-
-// 6
-{
-var a = [
-[
-0,
-1
-],
-2,
-3
-];
-}
-
-// 7
-{
-var a = [
-// [
-0,
-// 1
-// ],
-2,
-3
-];
-}
-
-// 8
-var x = [
-(function(){
-var a,
-b,
-c,
-d,
-e,
-f,
-g,
-h,
-i;
-})
-];
-
-// 9
-var a = [
-0 +
-5 *
-9 *
-'a',
-'b',
-0 +
-5 *
-9 *
-'c',
-'d',
-'e',
-'f',
-'g',
-'h',
-'i'
-];
-
-// 10
-var a,
-b,
-c,
-d,
-e,
-f,
-g,
-h,
-i;
-JSEND
-
-STARTTEST
-:set cin cino&
-/start of define
-=/end of define
-ENDTEST
-
-/* start of define */
-{
-}
-#define AAA \
-BBB\
-CCC
-
-#define CNT \
-1 + \
-2 + \
-4
-/* end of define */
-
-STARTTEST
-:set cin cino&
-/a = second
-ox
-ENDTEST
-
-{
-	a = second/*bug*/*line;
-}
-
-STARTTEST
-:g/^STARTTEST/.,/^ENDTEST/d
-:1;/start of AUTO/,$wq! test.out
-ENDTEST
deleted file mode 100644
--- a/src/testdir/test3.ok
+++ /dev/null
@@ -1,2102 +0,0 @@
-/* start of AUTO matically checked vim: set ts=4 : */
-{
-	if (test)
-		cmd1;
-	cmd2;
-}
-
-{
-	if (test)
-		cmd1;
-	else
-		cmd2;
-}
-
-{
-	if (test)
-	{
-		cmd1;
-		cmd2;
-	}
-}
-
-{
-	if (test)
-	{
-		cmd1;
-		else
-	}
-}
-
-{
-	while (this)
-		if (test)
-			cmd1;
-	cmd2;
-}
-
-{
-	while (this)
-		if (test)
-			cmd1;
-		else
-			cmd2;
-}
-
-{
-	if (test)
-	{
-		cmd;
-	}
-
-	if (test)
-		cmd;
-}
-
-{
-	if (test) {
-		cmd;
-	}
-
-	if (test) cmd;
-}
-
-{
-	cmd1;
-	for (blah)
-		while (this)
-			if (test)
-				cmd2;
-	cmd3;
-}
-
-{
-	cmd1;
-	for (blah)
-		while (this)
-			if (test)
-				cmd2;
-	cmd3;
-
-	if (test)
-	{
-		cmd1;
-		cmd2;
-		cmd3;
-	}
-}
-
-
-/* Test for 'cindent' do/while mixed with if/else: */
-
-{
-	do
-		if (asdf)
-			asdfasd;
-	while (cond);
-
-	do
-		if (asdf)
-			while (asdf)
-				asdf;
-	while (asdf);
-}
-
-/* Test for 'cindent' with two ) on a continuation line */
-{
-	if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
-			aal;sdkjf  ( ;asldfkja;sldfk
-				al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
-		line up here;
-}
-
-
-/* C++ tests: */
-
-// foo()		these three lines should remain in column 0
-// {
-// }
-
-/* Test for continuation and unterminated lines: */
-{
-	i = 99 + 14325 +
-		21345 +
-		21345 +
-		21345 + ( 21345 +
-				21345) +
-		2345 +
-		1234;
-	c = 1;
-}
-
-/*
-   testje for indent with empty line
-
-   here */
-
-{
-	if (testing &&
-			not a joke ||
-			line up here)
-		hay;
-	if (testing &&
-			(not a joke || testing
-			)line up here)
-		hay;
-	if (testing &&
-			(not a joke || testing
-			 line up here))
-		hay;
-}
-
-
-{
-	switch (c)
-	{
-		case xx:
-			do
-				if (asdf)
-					do
-						asdfasdf;
-					while (asdf);
-				else
-					asdfasdf;
-			while (cond);
-		case yy:
-		case xx:
-		case zz:
-			testing;
-	}
-}
-
-{
-	if (cond) {
-		foo;
-	}
-	else
-	{
-		bar;
-	}
-}
-
-{
-	if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
-				alsdkfj (asldk;fj
-					awith cino=(0 ;lf this one goes to below the paren with ==
-						;laksjfd ;lsakdjf ;alskdf asd)
-					asdfasdf;)))
-		asdfasdf;
-}
-
-	int
-func(a, b)
-	int a;
-	int c;
-{
-	if (c1 && (c2 ||
-				c3))
-		foo;
-	if (c1 &&
-			(c2 || c3)
-	   )
-}
-
-{
-	while (asd)
-	{
-		if (asdf)
-			if (test)
-				if (that)
-				{
-					if (asdf)
-						do
-							cdasd;
-						while (as
-								df);
-				}
-				else
-					if (asdf)
-						asdf;
-					else
-						asdf;
-		asdf;
-	}
-}
-
-{
-	s = "/*"; b = ';'
-		s = "/*"; b = ';';
-	a = b;
-}
-
-{
-	switch (a)
-	{
-		case a:
-			switch (t)
-			{
-				case 1:
-					cmd;
-					break;
-				case 2:
-					cmd;
-					break;
-			}
-			cmd;
-			break;
-		case b:
-			{
-				int i;
-				cmd;
-			}
-			break;
-		case c: {
-					int i;
-					cmd;
-				}
-		case d: if (cond &&
-						test) {		/* this line doesn't work right */
-					int i;
-					cmd;
-				}
-				break;
-	}
-}
-
-{
-	if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
-			(bp_to->b_p_initialized ||
-			 (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
-		return;
-label :
-	asdf = asdf ?
-		asdf : asdf;
-	asdf = asdf ?
-		asdf: asdf;
-}
-
-/* Special Comments	: This function has the added complexity (compared  */
-/*					: to addtolist) of having to check for a detail     */
-/*					: texture and add that to the list first.	 	    */
-
-char *(array[100]) = {
-	"testje",
-	"foo",
-	"bar",
-}
-
-enum soppie
-{
-	yes = 0,
-	no,
-	maybe
-};
-
-typedef enum soppie
-{
-	yes = 0,
-	no,
-	maybe
-};
-
-static enum
-{
-	yes = 0,
-	no,
-	maybe
-} soppie;
-
-public static enum
-{
-	yes = 0,
-	no,
-	maybe
-} soppie;
-
-static private enum
-{
-	yes = 0,
-	no,
-	maybe
-} soppie;
-
-{
-	int a,
-		b;
-}
-
-{
-	struct Type
-	{
-		int i;
-		char *str;
-	} var[] =
-	{
-		0, "zero",
-		1, "one",
-		2, "two",
-		3, "three"
-	};
-
-	float matrix[3][3] =
-	{
-		{
-			0,
-			1,
-			2
-		},
-		{
-			3,
-			4,
-			5
-		},
-		{
-			6,
-			7,
-			8
-		}
-	};
-}
-
-{
-	/* blah ( blah */
-	/* where does this go? */
-
-	/* blah ( blah */
-	cmd;
-
-	func(arg1,
-			/* comment */
-			arg2);
-	a;
-	{
-		b;
-		{
-			c; /* Hey, NOW it indents?! */
-		}
-	}
-
-	{
-		func(arg1,
-				arg2,
-				arg3);
-		/* Hey, what am I doing here?  Is this coz of the ","? */
-	}
-}
-
-main ()
-{
-	if (cond)
-	{
-		a = b;
-	}
-	if (cond) {
-		a = c;
-	}
-	if (cond)
-		a = d;
-	return;
-}
-
-{
-	case 2: if (asdf &&
-					asdfasdf)
-				aasdf;
-			a = 9;
-	case 3: if (asdf)
-				aasdf;
-			a = 9;
-	case 4:    x = 1;
-			   y = 2;
-
-label:	if (asdf)
-			here;
-
-label:  if (asdf &&
-				asdfasdf)
-		{
-		}
-
-label:  if (asdf &&
-				asdfasdf) {
-			there;
-		}
-
-label:  if (asdf &&
-				asdfasdf)
-			there;
-}
-
-{
-	/*
-	   hello with ":set comments= cino=c5"
-	 */
-
-	/*
-	   hello with ":set comments= cino="
-	 */
-}
-
-
-{
-	if (a < b) {
-		a = a + 1;
-	} else
-		a = a + 2;
-
-	if (a)
-		do {
-			testing;
-		} while (asdfasdf);
-	a = b + 1;
-	asdfasdf
-}
-
-{
-	for ( int i = 0;
-			i < 10; i++ )
-	{
-	}
-	i = 0;
-}
-
-class bob
-{
-	int foo() {return 1;}
-	int bar;
-}
-
-main()
-{
-	while(1)
-		if (foo)
-		{
-			bar;
-		}
-		else {
-			asdf;
-		}
-	misplacedline;
-}
-
-{
-	if (clipboard.state == SELECT_DONE
-			&& ((row == clipboard.start.lnum
-					&& col >= clipboard.start.col)
-				|| row > clipboard.start.lnum))
-}
-
-{
-	if (1) {i += 4;}
-	where_am_i;
-	return 0;
-}
-
-{
-	{
-	} // sdf(asdf
-	if (asdf)
-		asd;
-}
-
-{
-label1:
-label2:
-}
-
-{
-	int fooRet = foo(pBar1, false /*fKB*/,
-			true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
-	f() {
-		for ( i = 0;
-				i < m;
-				/* c */ i++ ) {
-			a = b;
-		}
-	}
-}
-
-{
-	f1(/*comment*/);
-	f2();
-}
-
-{
-	do {
-		if (foo) {
-		} else
-			;
-	} while (foo);
-	foo();	// was wrong
-}
-
-int x;	    // no extra indent because of the ;
-void func()
-{
-}
-
-char *tab[] = {"aaa",
-	"};", /* }; */ NULL}
-	int indented;
-{}
-
-char *a[] = {"aaa", "bbb",
-	"ccc", NULL};
-// here
-
-char *tab[] = {"aaa",
-	"xx", /* xx */};    /* asdf */
-int not_indented;
-
-{
-	do {
-		switch (bla)
-		{
-			case 1: if (foo)
-						bar;
-		}
-	} while (boo);
-	wrong;
-}
-
-int	foo,
-	bar;
-int foo;
-
-#if defined(foo) \
-	&& defined(bar)
-char * xx = "asdf\
-			 foo\
-			 bor";
-int x;
-
-char    *foo = "asdf\
-				asdf\
-				asdf",
-		*bar;
-
-void f()
-{
-#if defined(foo) \
-	&& defined(bar)
-	char    *foo = "asdf\
-					asdf\
-					asdf",
-			*bar;
-	{
-		int i;
-		char    *foo = "asdf\
-						asdf\
-						asdf",
-				*bar;
-	}
-#endif
-}
-#endif
-
-int y;		// comment
-// comment
-
-// comment
-
-{
-	Constructor(int a,
-			int b )  : BaseClass(a)
-	{
-	}
-}
-
-void foo()
-{
-	char one,
-		 two;
-	struct bla piet,
-			   jan;
-	enum foo kees,
-			 jannie;
-	static unsigned sdf,
-					krap;
-	unsigned int piet,
-				 jan;
-	int
-		kees,
-		jan;
-}
-
-{
-	t(int f,
-			int d);		// )
-	d();
-}
-
-Constructor::Constructor(int a,
-		int b 
-		)  : 
-	BaseClass(a,
-			b,
-			c),
-	mMember(b),
-{
-}
-
-Constructor::Constructor(int a,
-		int b )  : 
-	BaseClass(a)
-{
-}
-
-Constructor::Constructor(int a,
-		int b ) /*x*/ : /*x*/ BaseClass(a),
-	member(b)
-{
-}
-
-A::A(int a, int b)
-	: aa(a),
-	bb(b),
-	cc(c)
-{
-}
-
-class CAbc :
-	public BaseClass1,
-	protected BaseClass2
-{
-	int Test() { return FALSE; }
-	int Test1() { return TRUE; }
-
-	CAbc(int a, int b )  : 
-		BaseClass(a)
-	{ 
-		switch(xxx)
-		{
-			case abc:
-				asdf();
-				break;
-
-			case 999:
-				baer();
-				break;
-		}
-	}
-
-	public: // <-- this was incoreectly indented before!!
-	void testfall();
-	protected:
-	void testfall();
-};
-
-class CAbc : public BaseClass1,
-	protected BaseClass2
-{
-};
-
-static struct
-{
-	int a;
-	int b;
-} variable[COUNT] =
-{
-	{
-		123,
-		456
-	},
-	{
-		123,
-		456
-	}
-};
-
-static struct
-{
-	int a;
-	int b;
-} variable[COUNT] =
-{
-	{ 123, 456 },
-	{ 123, 456 }
-};
-
-void asdf()		/* ind_maxparen may cause trouble here */
-{
-	if ((0
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1
-				&& 1)) break;
-}
-
-foo()
-{
-	a = cond ? foo() : asdf
-		+ asdf;
-
-	a = cond ?
-		foo() : asdf
-		+ asdf;
-}
-
-int  main(void)
-{
-	if (a)
-		if (b)
-			2;
-		else 3;
-	next_line_of_code();
-}
-
-barry()
-{
-	Foo::Foo (int one,
-			int two)
-		: something(4)
-	{}
-}
-
-barry()
-{
-	Foo::Foo (int one, int two)
-		: something(4)
-	{}
-}
-
-Constructor::Constructor(int a,
-		int b 
-		)  : 
-	BaseClass(a,
-			b,
-			c),
-	mMember(b)
-{
-}
-int main ()
-{
-	if (lala)
-		do
-			++(*lolo);
-		while (lili
-				&& lele);
-	lulu;
-}
-
-int main ()
-{
-	switch (c)
-	{
-		case 'c': if (cond)
-				  {
-				  }
-	}
-}
-
-main()
-{
-	(void) MyFancyFuasdfadsfnction(
-			argument);
-}
-
-main()
-{
-	char	foo[] = "/*";
-	/* as
-	   df */
-	hello
-}
-
-/* valid namespaces with normal indent */
-namespace
-{
-	{
-		111111111111;
-	}
-}
-namespace /* test */
-{
-	11111111111111111;
-}
-namespace // test
-{
-	111111111111111111;
-}
-namespace
-{
-	111111111111111111;
-}
-namespace test
-{
-	111111111111111111;
-}
-namespace{
-	111111111111111111;
-}
-namespace test{
-	111111111111111111;
-}
-namespace {
-	111111111111111111;
-}
-namespace test {
-	111111111111111111;
-	namespace test2 {
-		22222222222222222;
-	}
-}
-
-/* invalid namespaces use block indent */
-namespace test test2 {
-	111111111111111111111;
-}
-namespace11111111111 {
-	111111111111;
-}
-namespace() {
-	1111111111111;
-}
-namespace()
-{
-	111111111111111111;
-}
-namespace test test2
-{
-	1111111111111111111;
-}
-namespace111111111
-{
-	111111111111111111;
-}
-
-void getstring() {
-	/* Raw strings */
-	const char* s = R"(
-  test {
-    # comment
-    field: 123
-  }
- )";
-}
-
-void getstring() {
-	const char* s = R"foo(
-  test {
-    # comment
-    field: 123
-  }
-    )foo";
-}
-
-{
-	int a[4] = {
-		[0] = 0,
-		[1] = 1,
-		[2] = 2,
-		[3] = 3,
-	};
-}
-
-{
-	a = b[2]
-		+ 3;
-}
-
-{
-	if (1)
-		/* aaaaa
-		 * bbbbb
-		 */
-		a = 1;
-}
-
-void func()
-{
-	switch (foo)
-	{
-		case (bar):
-			if (baz())
-				quux();
-			break;
-		case (shmoo):
-			if (!bar)
-			{
-			}
-		case (foo1):
-			switch (bar)
-			{
-				case baz:
-					baz_f();
-					break;
-			}
-			break;
-		default:
-			baz();
-			baz();
-			break;
-	}
-}
-
-/* end of AUTO */
-
-
-{
-
-/* this is
- * a real serious
- * about life, the
- * universe, and the
- * rest important big
- * comment
- */
-	/* insert " about life, the universe, and the rest" after "serious" */
-}
-
-
-{
-	/*
-	 * Testing for comments, without 'cin' set
-	 */
-about life
-
-/*
-* what happens here?
-*/
-there
-
-	/*
-	   the end of the comment, try inserting a line below */
-line
-
-		/* how about
-hello
-		                this one */
-}
-
-
-{
-    var = this + that + vec[0] * vec[0]
-				      + vec[1] * vec[1]
-					  + vec2[2] * vec[2];
-}
-
-
-{
-		asdf asdflkajds f;
-	if (tes & ting) {
-		asdf asdf asdf ;
-		asdfa sdf asdf;
-		}
-	testing1;
-	if (tes & ting)
-	{
-		asdf asdf asdf ;
-		asdfa sdf asdf;
-		}
-	testing2;
-}
-
-
-main ( int first_par, /*
-					   * Comment for
-					   * first par
-					   */
-	   int second_par /*
-					   * Comment for
-					   * second par
-					   */
-	 )
-{
-	func( first_par, /*
-					  * Comment for
-					  * first par
-					  */
-		  second_par /*
-					  * Comment for
-					  * second par
-					  */
-		);
-
-}
-
-
-main(void)
-{
-	/* Make sure that cino=X0s is not parsed like cino=Xs. */
-	if (cond)
-		foo();
-	else
-	{
-		bar();
-	}
-}
-
-
-{
-	do
-	{
-		if ()
-		{
-			if ()
-				asdf;
-			else
-				asdf;
-		}
-	} while ();
-	cmd;		/* this should go under the } */
-}
-
-
-void f()
-{
-	if ( k() ) {
-		l();
-
-	} else { /* Start (two words) end */
-		m();
-	}
-
-	n();
-}
-
-
-void f()
-	{
-	if ( k() )
-		{
-		l();
-		} else { /* Start (two words) end */
-		m();
-		}
-	n();	/* should be under the if () */
-}
-
-
-void bar(void)
-	{
-	static array[2][2] =
-		{
-			{ 1, 2 },
-			{ 3, 4 },
-		}
-
-	while (a)
-		{
-		foo(&a);
-		}
-
-		{
-		int a;
-			{
-			a = a + 1;
-			}
-		}
-	b = a;
-	}
-
-void func(void)
-	{
-	a = 1;
-		{
-		b = 2;
-		}
-	c = 3;
-	d = 4;
-	}
-/* foo */
-
-
-a()
-{
-  do {
-    a = a +
-      a;
-  } while ( a );		/* add text under this line */
-  here
-    if ( a )
-      a;
-}
-
-
-a()
-{
-label1:
-            /* hmm */
-            // comment
-label2: b();
-label3 /* post */:
-/* pre */ label4:
-		f(/*com*/);
-		if (/*com*/)
-			cmd();
-}
-
-
-/*
- * A simple comment
- */
-
-/*
-** A different comment
-*/
-
-
-void f()
-{
-
-	/*********
-	  A comment.
-	*********/
-}
-
-
-void f()
-{
-
-	/*********
-	A comment.
-	*********/
-}
-
-
-void f()
-{
-	c = c1 &&
-		(
-		 c2 ||
-		 c3
-		) && c4;
-}
-
-
-void f()
-{
-	c = c1 &&
-		(
-		 c2 ||
-		 c3
-		) && c4;
-}
-
-
-void f()
-{
-	c = c1 &&
-		(
-			c2 ||
-			c3
-		) && c4;
-}
-
-
-void f()
-{
-	if (   c1
-		   && (   c2
-				  || c3))
-		foo;
-}
-
-
-void f()
-{
-	if (   c1
-		&& (   c2
-			|| c3))
-		foo;
-}
-
-
-void f()
-{
-	c = c1 && (
-		c2 ||
-		c3
-		) && c4;
-	if (
-		c1 && c2
-	   )
-		foo;
-}
-
-
-void f()
-{
-	c = c1 && (
-		c2 ||
-		c3
-	) && c4;
-	if (
-		c1 && c2
-	)
-		foo;
-}
-
-
-void f()
-{
-	switch (x)
-	{
-		case 1:
-			a = b;
-		break;
-		default:
-			a = 0;
-		break;
-	}
-}
-
-
-void f()
-{
-	invokeme(
-		 argu,
-		 ment);
-	invokeme(
-		 argu,
-		 ment
-		 );
-	invokeme(argu,
-			 ment
-			);
-}
-
-
-void f()
-{
-	statement;
-		  // comment 1
-		  // comment 2
-}
-
-
-void f()
-{
-	statement;
-	   // comment 1
-	   // comment 2
-}
-
-
-class CAbc
-{
-	int Test() { return FALSE; }
-
-public: // comment
-	void testfall();
-protected:
-	void testfall();
-};
-
-
-class Foo : public Bar
-{
-	public:
-		virtual void method1(void) = 0;
-		virtual void method2(int arg1,
-							 int arg2,
-							 int arg3) = 0;
-};
-
-
-	void
-foo()
-{
-	if (a)
-	{
-	} else
-		asdf;
-}
-
-
-{
-	averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
-			asdasdf,
-			func(asdf,
-				 asdfadsf),
-			asdfasdf
-			);
-
-	/* those are ugly, but consequent */
-
-	func()->asd(asdasdf,
-				averylongfunctionname(
-						abc,
-						dec)->averylongfunctionname(
-								asdfadsf,
-								asdfasdf,
-								asdfasdf,
-								),
-				func(asdfadf,
-					 asdfasdf
-					),
-				asdasdf
-			   );
-
-	averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
-					abc,
-					dec)->asdfasdfasdf(
-							asdfadsf,
-							asdfasdf,
-							asdfasdf,
-							),
-			func(asdfadf,
-				 asdfasdf),
-			asdasdf
-			);
-}
-
-
-int main ()
-{
-	if (cond1 &&
-			cond2
-			)
-		foo;
-}
-
-
-void func(int a
-#if defined(FOO)
-		  , int b
-		  , int c
-#endif
-		 )
-{
-}
-
-
-	void
-func(int a
-#if defined(FOO)
-	 , int b
-	 , int c
-#endif
-	)
-{
-}
-
-
-void func(void)
-{
-	if(x==y)
-		if(y==z)
-			foo=1;
-		else { bar=1;
-			baz=2;
-		}
-	printf("Foo!\n");
-}
-
-void func1(void)
-{
-	char* tab[] = {"foo", "bar",
-		"baz", "quux",
-		"this line used", "to be indented incorrectly"};
-	foo();
-}
-
-void func2(void)
-{
-	int tab[] =
-	{1, 2,
-		3, 4,
-		5, 6};
-
-	printf("This line used to be indented incorrectly.\n");
-}
-
-int foo[]
-#ifdef BAR
-
-= { 1, 2, 3,
-	4, 5, 6 }
-
-#endif
-	;
-int baz;
-
-void func3(void)
-{
-	int tab[] = {
-		1, 2,
-		3, 4,
-		5, 6};
-
-	printf("Don't you dare indent this line incorrectly!\n");
-}
-
-	void
-func4(a, b,
-		c)
-	int a;
-	int b;
-	int c;
-{
-}
-
-	void
-func5(
-		int a,
-		int b)
-{
-}
-
-	void
-func6(
-		int a)
-{
-}
-
-
-void func(void)
-{
-	int tab[] =
-	{
-		1, 2, 3,
-		4, 5, 6};
-
-	printf("Indent this line correctly!\n");
-
-	switch (foo)
-	{
-		case bar:
-			printf("bar");
-			break;
-		case baz: {
-			printf("baz");
-			break;
-		}
-		case quux:
-			printf("But don't break the indentation of this instruction\n");
-			break;
-	}
-}
-
-
-void func(void)
-{
-	cout << "a"
-		<< "b"
-		<< ") :"
-		<< "c";
-}
-
-
-void func(void)
-{
-	/*
-	 * This is a comment.
-	 */
-	foo();
-}
-
-
-void func(void)
-{
-	for (int i = 0; i < 10; ++i)
-		if (i & 1) {
-			foo(1);
-		} else
-			foo(0);
-	baz();
-}
-
-
-void func(void)
-{
-	if (condition1
-			&& condition2)
-		action();
-	function(argument1
-			 && argument2);
-
-	if (c1 && (c2 ||
-				c3))
-		foo;
-	if (c1 &&
-			(c2 || c3))
-	{
-	}
-
-	if (   c1
-			&& (      c2
-					  || c3))
-		foo;
-	func( c1
-		  && (     c2
-				   || c3))
-		foo;
-}
-
-
-void func(void)
-{
-	if (condition1
-			&& condition2)
-		action();
-	function(argument1
-		&& argument2);
-
-	if (c1 && (c2 ||
-				c3))
-		foo;
-	if (c1 &&
-			(c2 || c3))
-	{
-	}
-
-	if (   c1
-			&& (      c2
-				|| c3))
-		foo;
-	func(   c1
-		&& (      c2
-			|| c3))
-		foo;
-}
-
-
-void func(void)
-{
-	if (condition1
-			&& condition2)
-		action();
-	function(argument1
-		&& argument2);
-
-	if (c1 && (c2 ||
-				c3))
-		foo;
-	if (c1 &&
-			(c2 || c3))
-	{
-	}
-	if (c123456789
-			&& (c22345
-				|| c3))
-		printf("foo\n");
-
-	c = c1 &&
-		(
-			c2 ||
-			c3
-		) && c4;
-}
-
-
-void func(void)
-{
-	if (condition1
-			&& condition2)
-		action();
-	function(argument1
-			 && argument2);
-
-	if (c1 && (c2 ||
-				c3))
-		foo;
-	if (c1 &&
-			(c2 || c3))
-	{
-	}
-	if (c123456789
-			&& (c22345
-				|| c3))
-		printf("foo\n");
-
-	if (   c1
-			&& (   c2
-				   || c3))
-		foo;
-
-	a_long_line(
-		argument,
-		argument);
-	a_short_line(argument,
-				 argument);
-}
-
-
-void func(void)
-{
-	if (condition1
-			&& condition2)
-		action();
-	function(argument1
-			&& argument2);
-
-	if (c1 && (c2 ||
-			  c3))
-		foo;
-	if (c1 &&
-			(c2 || c3))
-	{
-	}
-	if (c123456789
-			&& (c22345
-			  || c3))
-		printf("foo\n");
-}
-
-
-void func(void)
-{
-	if (condition1
-			&& condition2)
-		action();
-	function(argument1
-			 && argument2);
-
-	if (c1 && (c2 ||
-				c3))
-		foo;
-	if (c1 &&
-			(c2 || c3))
-	{
-	}
-	if (c123456789
-			&& (c22345
-				|| c3))
-		printf("foo\n");
-
-	if (   c1
-			&& (      c2
-				|| c3))
-		foo;
-	func(   c1
-		 && (      c2
-			 || c3))
-		foo;
-}
-
-
-void func(void)
-{
-	if (condition1
-	  && condition2)
-		action();
-	function(argument1
-		&& argument2);
-
-	if (c1 && (c2 ||
-		  c3))
-		foo;
-	if (c1 &&
-	  (c2 || c3))
-	{
-	}
-}
-
-
-NAMESPACESTART
-/* valid namespaces with normal indent */
-namespace
-{
-{
-	111111111111;
-}
-}
-namespace /* test */
-{
-11111111111111111;
-}
-namespace // test
-{
-111111111111111111;
-}
-namespace
-{
-111111111111111111;
-}
-namespace test
-{
-111111111111111111;
-}
-namespace test::cpp17
-{
-111111111111111111;
-}
-namespace ::incorrectcpp17
-{
-	111111111111111111;
-}
-namespace test::incorrectcpp17::
-{
-	111111111111111111;
-}
-namespace test:incorrectcpp17
-{
-	111111111111111111;
-}
-namespace test:::incorrectcpp17
-{
-	111111111111111111;
-}
-namespace{
-111111111111111111;
-}
-namespace test{
-111111111111111111;
-}
-namespace {
-111111111111111111;
-}
-namespace test {
-111111111111111111;
-namespace test2 {
-22222222222222222;
-}
-}
-
-/* invalid namespaces use block indent */
-namespace test test2 {
-	111111111111111111111;
-}
-namespace11111111111 {
-	111111111111;
-}
-namespace() {
-	1111111111111;
-}
-namespace()
-{
-	111111111111111111;
-}
-namespace test test2
-{
-	1111111111111111111;
-}
-namespace111111111
-{
-	111111111111111111;
-}
-NAMESPACEEND
-
-
-
-JSSTART
-var bar = {
-	foo: {
-		that: this,
-		some: ok,
-	},
-	"bar":{
-		a : 2,
-		b: "123abc",
-		x: 4,
-		"y": 5
-	}
-}
-JSEND
-
-
-JSSTART
-var foo = [
-	1,
-	2,
-	3
-];
-JSEND
-
-
-JSSTART
-function bar() {
-	var foo = [
-		1,
-		2,
-		3
-	];
-}
-JSEND
-
-
-JSSTART
-(function($){
-
-	if (cond &&
-			cond) {
-		stmt;
-	}
-	window.something.left =
-		(width - 50 + offset) + "px";
-	var class_name='myclass';
-
-	function private_method() {
-	}
-
-	var public_method={
-		method: function(options,args){
-			private_method();
-		}
-	}
-
-	function init(options) {
-
-		$(this).data(class_name+'_public',$.extend({},{
-			foo: 'bar',
-			bar: 2,
-			foobar: [
-				1,
-				2,
-				3
-			],
-			callback: function(){
-				return true;
-			}
-		}, options||{}));
-	}
-
-	$.fn[class_name]=function() {
-
-		var _arguments=arguments;
-		return this.each(function(){
-
-			var options=$(this).data(class_name+'_public');
-			if (!options) {
-				init.apply(this,_arguments);
-
-			} else {
-				var method=public_method[_arguments[0]];
-
-				if (typeof(method)!='function') {
-					console.log(class_name+' has no method "'+_arguments[0]+'"');
-					return false;
-				}
-				_arguments[0]=options;
-				method.apply(this,_arguments);
-			}
-		});
-	}
-
-})(jQuery);
-JSEND
-
-
-JSSTART
-function init(options) {
-	$(this).data(class_name+'_public',$.extend({},{
-		foo: 'bar',
-		bar: 2,
-		foobar: [
-			1,
-			2,
-			3
-		],
-		callback: function(){
-			return true;
-		}
-	}, options||{}));
-}
-JSEND
-
-
-JSSTART
-(function($){
-	function init(options) {
-		$(this).data(class_name+'_public',$.extend({},{
-			foo: 'bar',
-			bar: 2,
-			foobar: [
-				1,
-				2,
-				3
-			],
-			callback: function(){
-				return true;
-			}
-		}, options||{}));
-	}
-})(jQuery);
-JSEND
-
-
-JSSTART
-// Results of JavaScript indent
-// 1
-(function(){
-	var a = [
-	  'a',
-	  'b',
-	  'c',
-	  'd',
-	  'e',
-	  'f',
-	  'g',
-	  'h',
-	  'i'
-	];
-}())
-
-// 2
-(function(){
-	var a = [
-	  0 +
-		5 *
-		9 *
-		'a',
-	  'b',
-	  0 +
-		5 *
-		9 *
-		'c',
-	  'd',
-	  'e',
-	  'f',
-	  'g',
-	  'h',
-	  'i'
-	];
-}())
-
-// 3
-(function(){
-	var a = [
-	  0 +
-		// comment 1
-		5 *
-		/* comment 2 */
-		9 *
-		'a',
-	  'b',
-	  0 +
-		5 *
-		9 *
-		'c',
-	  'd',
-	  'e',
-	  'f',
-	  'g',
-	  'h',
-	  'i'
-	];
-}())
-
-// 4
-{
-	var a = [
-	  0,
-	  1
-	];
-	var b;
-	var c;
-}
-
-// 5
-{
-	var a = [
-	  [
-		0
-	  ],
-	  2,
-	  3
-	];
-}
-
-// 6
-{
-	var a = [
-	  [
-		0,
-		1
-	  ],
-	  2,
-	  3
-	];
-}
-
-// 7
-{
-	var a = [
-	  // [
-	  0,
-	  // 1
-	  // ],
-	  2,
-	  3
-	];
-}
-
-// 8
-var x = [
-  (function(){
-	  var a,
-	  b,
-	  c,
-	  d,
-	  e,
-	  f,
-	  g,
-	  h,
-	  i;
-  })
-];
-
-// 9
-var a = [
-  0 +
-  5 *
-  9 *
-  'a',
-  'b',
-  0 +
-  5 *
-  9 *
-  'c',
-  'd',
-  'e',
-  'f',
-  'g',
-  'h',
-  'i'
-];
-
-// 10
-var a,
-	b,
-	c,
-	d,
-	e,
-	f,
-	g,
-	h,
-	i;
-JSEND
-
-
-/* start of define */
-{
-}
-#define AAA \
-	BBB\
-	CCC
-
-#define CNT \
-	1 + \
-	2 + \
-	4
-/* end of define */
-
-
-{
-	a = second/*bug*/*line;
-	x
-}
-
--- a/src/testdir/test_cindent.vim
+++ b/src/testdir/test_cindent.vim
@@ -1,6 +1,5 @@
 " Test for cinoptions and cindent
 "
-" TODO: rewrite test3.in into this new style test
 
 func Test_cino_hash()
   " Test that curbuf->b_ind_hash_comment is correctly reset
@@ -128,4 +127,5128 @@ func Test_cindent_func()
   bwipe!
 endfunc
 
+func Test_cindent_1()
+  new
+  setl cindent ts=4 sw=4
+  setl cino& sts&
+
+  let code =<< trim [CODE]
+  /* start of AUTO matically checked vim: set ts=4 : */
+  {
+  	if (test)
+  		cmd1;
+  	cmd2;
+  }
+
+  {
+  	if (test)
+  		cmd1;
+  	else
+  		cmd2;
+  }
+
+  {
+  	if (test)
+  	{
+  		cmd1;
+  		cmd2;
+  	}
+  }
+
+  {
+  	if (test)
+  	{
+  		cmd1;
+  		else
+  	}
+  }
+
+  {
+  	while (this)
+  		if (test)
+  			cmd1;
+  	cmd2;
+  }
+
+  {
+  	while (this)
+  		if (test)
+  			cmd1;
+  		else
+  			cmd2;
+  }
+
+  {
+  	if (test)
+  	{
+  		cmd;
+  	}
+
+  	if (test)
+  		cmd;
+  }
+
+  {
+  	if (test) {
+  		cmd;
+  	}
+
+  	if (test) cmd;
+  }
+
+  {
+  	cmd1;
+  	for (blah)
+  		while (this)
+  			if (test)
+  				cmd2;
+  	cmd3;
+  }
+
+  {
+  	cmd1;
+  	for (blah)
+  		while (this)
+  			if (test)
+  				cmd2;
+  	cmd3;
+
+  	if (test)
+  	{
+  		cmd1;
+  		cmd2;
+  		cmd3;
+  	}
+  }
+
+
+  /* Test for 'cindent' do/while mixed with if/else: */
+
+  {
+  	do
+  		if (asdf)
+  			asdfasd;
+  	while (cond);
+
+  	do
+  		if (asdf)
+  			while (asdf)
+  				asdf;
+  	while (asdf);
+  }
+
+  /* Test for 'cindent' with two ) on a continuation line */
+  {
+  	if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
+  			aal;sdkjf  ( ;asldfkja;sldfk
+  					al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
+  		line up here;
+  }
+
+
+  /* C++ tests: */
+
+  // foo()		these three lines should remain in column 0
+  // {
+  // }
+
+  /* Test for continuation and unterminated lines: */
+  {
+  	i = 99 + 14325 +
+  		21345 +
+  		21345 +
+  		21345 + ( 21345 +
+  				21345) +
+  		2345 +
+  		1234;
+  	c = 1;
+  }
+
+  /*
+     testje for indent with empty line
+
+     here */
+
+  {
+  	if (testing &&
+  			not a joke ||
+  			line up here)
+  		hay;
+  	if (testing &&
+  			(not a joke || testing
+  			)line up here)
+  		hay;
+  	if (testing &&
+  			(not a joke || testing
+  			 line up here))
+  		hay;
+  }
+
+
+  {
+  	switch (c)
+  	{
+  		case xx:
+  			do
+  				if (asdf)
+  					do
+  						asdfasdf;
+  					while (asdf);
+  				else
+  					asdfasdf;
+  			while (cond);
+  		case yy:
+  		case xx:
+  		case zz:
+  			testing;
+  	}
+  }
+
+  {
+  	if (cond) {
+  		foo;
+  	}
+  	else
+  	{
+  		bar;
+  	}
+  }
+
+  {
+  	if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
+  			alsdkfj (asldk;fj
+  					awith cino=(0 ;lf this one goes to below the paren with ==
+  							;laksjfd ;lsakdjf ;alskdf asd)
+  					asdfasdf;)))
+  		asdfasdf;
+  }
+
+  	int
+  func(a, b)
+  	int a;
+  	int c;
+  {
+  	if (c1 && (c2 ||
+  			c3))
+  		foo;
+  	if (c1 &&
+  			(c2 || c3)
+  	   )
+  }
+
+  {
+  	while (asd)
+  	{
+  		if (asdf)
+  			if (test)
+  				if (that)
+  				{
+  					if (asdf)
+  						do
+  							cdasd;
+  						while (as
+  								df);
+  				}
+  				else
+  					if (asdf)
+  						asdf;
+  					else
+  						asdf;
+  		asdf;
+  	}
+  }
+
+  {
+  	s = "/*"; b = ';'
+  		s = "/*"; b = ';';
+  	a = b;
+  }
+
+  {
+  	switch (a)
+  	{
+  		case a:
+  			switch (t)
+  			{
+  				case 1:
+  					cmd;
+  					break;
+  				case 2:
+  					cmd;
+  					break;
+  			}
+  			cmd;
+  			break;
+  		case b:
+  			{
+  				int i;
+  				cmd;
+  			}
+  			break;
+  		case c: {
+  					int i;
+  					cmd;
+  				}
+  		case d: if (cond &&
+  						test) {		/* this line doesn't work right */
+  					int i;
+  					cmd;
+  				}
+  				break;
+  	}
+  }
+
+  {
+  	if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
+  			(bp_to->b_p_initialized ||
+  			 (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
+  		return;
+  label :
+  	asdf = asdf ?
+  		asdf : asdf;
+  	asdf = asdf ?
+  		asdf: asdf;
+  }
+
+  /* Special Comments	: This function has the added complexity (compared  */
+  /*					: to addtolist) of having to check for a detail     */
+  /*					: texture and add that to the list first.	 	    */
+
+  char *(array[100]) = {
+  	"testje",
+  	"foo",
+  	"bar",
+  }
+
+  enum soppie
+  {
+  yes = 0,
+  no,
+  maybe
+  };
+
+  typedef enum soppie
+  {
+  yes = 0,
+  no,
+  maybe
+  };
+
+  static enum
+  {
+  yes = 0,
+  no,
+  maybe
+  } soppie;
+
+  public static enum
+  {
+  yes = 0,
+  no,
+  maybe
+  } soppie;
+
+  static private enum
+  {
+  yes = 0,
+  no,
+  maybe
+  } soppie;
+
+  {
+  	int a,
+  		b;
+  }
+
+  {
+  	struct Type
+  	{
+  		int i;
+  		char *str;
+  	} var[] =
+  	{
+  		0, "zero",
+  		1, "one",
+  		2, "two",
+  		3, "three"
+  	};
+
+  	float matrix[3][3] =
+  	{
+  		{
+  			0,
+  			1,
+  			2
+  		},
+  		{
+  			3,
+  			4,
+  			5
+  		},
+  		{
+  			6,
+  			7,
+  			8
+  		}
+  	};
+  }
+
+  {
+  	/* blah ( blah */
+  	/* where does this go? */
+
+  	/* blah ( blah */
+  	cmd;
+
+  	func(arg1,
+  			/* comment */
+  			arg2);
+  	a;
+  	{
+  		b;
+  		{
+  			c; /* Hey, NOW it indents?! */
+  		}
+  	}
+
+  	{
+  		func(arg1,
+  				arg2,
+  				arg3);
+  		/* Hey, what am I doing here?  Is this coz of the ","? */
+  	}
+  }
+
+  main ()
+  {
+  	if (cond)
+  	{
+  		a = b;
+  	}
+  	if (cond) {
+  		a = c;
+  	}
+  	if (cond)
+  		a = d;
+  	return;
+  }
+
+  {
+  	case 2: if (asdf &&
+  					asdfasdf)
+  				aasdf;
+  			a = 9;
+  	case 3: if (asdf)
+  				aasdf;
+  			a = 9;
+  	case 4:    x = 1;
+  			   y = 2;
+
+  label:	if (asdf)
+  			here;
+
+  label:  if (asdf &&
+  				asdfasdf)
+  		{
+  		}
+
+  label:  if (asdf &&
+  				asdfasdf) {
+  			there;
+  		}
+
+  label:  if (asdf &&
+  				asdfasdf)
+  			there;
+  }
+
+  {
+  	/*
+  	   hello with ":set comments= cino=c5"
+  	 */
+
+  	/*
+  	   hello with ":set comments= cino="
+  	 */
+  }
+
+
+  {
+  	if (a < b) {
+  		a = a + 1;
+  	} else
+  		a = a + 2;
+
+  	if (a)
+  		do {
+  			testing;
+  		} while (asdfasdf);
+  	a = b + 1;
+  	asdfasdf
+  }
+
+  {
+  for ( int i = 0;
+  	i < 10; i++ )
+  {
+  }
+  	i = 0;
+  }
+
+  class bob
+  {
+  	int foo() {return 1;}
+  		int bar;
+  }
+
+  main()
+  {
+  while(1)
+  if (foo)
+  {
+  bar;
+  }
+  else {
+  asdf;
+  }
+  misplacedline;
+  }
+
+  {
+  	if (clipboard.state == SELECT_DONE
+  	&& ((row == clipboard.start.lnum
+  	&& col >= clipboard.start.col)
+  	|| row > clipboard.start.lnum))
+  }
+
+  {
+  if (1) {i += 4;}
+  where_am_i;
+  return 0;
+  }
+
+  {
+  {
+  } // sdf(asdf
+  if (asdf)
+  asd;
+  }
+
+  {
+  label1:
+  label2:
+  }
+
+  {
+  int fooRet = foo(pBar1, false /*fKB*/,
+  	true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
+  f() {
+  for ( i = 0;
+  	i < m;
+  	/* c */ i++ ) {
+  a = b;
+  }
+  }
+  }
+
+  {
+  	f1(/*comment*/);
+  	f2();
+  }
+
+  {
+  do {
+  if (foo) {
+  } else
+  ;
+  } while (foo);
+  foo();	// was wrong
+  }
+
+  int x;	    // no extra indent because of the ;
+  void func()
+  {
+  }
+
+  char *tab[] = {"aaa",
+  	"};", /* }; */ NULL}
+  	int indented;
+  {}
+
+  char *a[] = {"aaa", "bbb",
+  	"ccc", NULL};
+  // here
+
+  char *tab[] = {"aaa",
+  	"xx", /* xx */};    /* asdf */
+  int not_indented;
+
+  {
+  	do {
+  		switch (bla)
+  		{
+  			case 1: if (foo)
+  						bar;
+  		}
+  	} while (boo);
+  					wrong;
+  }
+
+  int	foo,
+  	bar;
+  int foo;
+
+  #if defined(foo) \
+  	&& defined(bar)
+  char * xx = "asdf\
+  	foo\
+  	bor";
+  int x;
+
+  char    *foo = "asdf\
+  	asdf\
+  	asdf",
+  	*bar;
+
+  void f()
+  {
+  #if defined(foo) \
+  	&& defined(bar)
+  char    *foo = "asdf\
+  	asdf\
+  	asdf",
+  	*bar;
+  	{
+  	int i;
+  char    *foo = "asdf\
+  	asdf\
+  	asdf",
+  	*bar;
+  	}
+  #endif
+  }
+  #endif
+
+  int y;		// comment
+  		// comment
+
+  	// comment
+
+  {
+  	Constructor(int a,
+  			int b )  : BaseClass(a)
+  	{
+  	}
+  }
+
+  void foo()
+  {
+  	char one,
+  	two;
+  	struct bla piet,
+  	jan;
+  	enum foo kees,
+  	jannie;
+  	static unsigned sdf,
+  	krap;
+  	unsigned int piet,
+  	jan;
+  	int
+  	kees,
+  	jan;
+  }
+
+  {
+  	t(int f,
+  			int d);		// )
+  	d();
+  }
+
+  Constructor::Constructor(int a,
+                           int b 
+                          )  : 
+     BaseClass(a,
+               b,
+               c),
+     mMember(b),
+  {
+  }
+
+  Constructor::Constructor(int a,
+                           int b )  : 
+     BaseClass(a)
+  {
+  }
+
+  Constructor::Constructor(int a,
+                           int b ) /*x*/ : /*x*/ BaseClass(a),
+                                                 member(b)
+  {
+  }
+
+  A::A(int a, int b)
+  : aa(a),
+  bb(b),
+  cc(c)
+  {
+  }
+
+  class CAbc :
+     public BaseClass1,
+     protected BaseClass2
+  {
+     int Test() { return FALSE; }
+     int Test1() { return TRUE; }
+
+     CAbc(int a, int b )  : 
+        BaseClass(a)
+     { 
+        switch(xxx)
+        {
+           case abc:
+              asdf();
+              break;
+
+           case 999:
+              baer();
+              break;
+        }
+     }
+
+  public: // <-- this was incoreectly indented before!!
+     void testfall();
+  protected:
+     void testfall();
+  };
+
+  class CAbc : public BaseClass1,
+               protected BaseClass2
+  {
+  };
+
+  static struct
+  {
+      int a;
+      int b;
+  } variable[COUNT] =
+  {
+      {
+          123,
+          456
+      },
+  	{
+          123,
+          456
+      }
+  };
+
+  static struct
+  {
+      int a;
+      int b;
+  } variable[COUNT] =
+  {
+      { 123, 456 },
+  	{ 123, 456 }
+  };
+
+  void asdf()		/* ind_maxparen may cause trouble here */
+  {
+  	if ((0
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1)) break;
+  }
+
+  foo()
+  {
+  	a = cond ? foo() : asdf
+  					   + asdf;
+
+  	a = cond ?
+  		foo() : asdf
+  				+ asdf;
+  }
+
+  int  main(void)
+  {
+  	if (a)
+  		if (b)
+  			2;
+  		else 3;
+  	next_line_of_code();
+  }
+
+  barry()
+  {
+  	Foo::Foo (int one,
+  			int two)
+  		: something(4)
+  	{}
+  }
+
+  barry()
+  {
+  	Foo::Foo (int one, int two)
+  		: something(4)
+  	{}
+  }
+
+  Constructor::Constructor(int a,
+  		int b 
+  		)  : 
+  	BaseClass(a,
+  			b,
+  			c),
+  	mMember(b)
+  {
+  }
+         int main ()
+         {
+  	 if (lala)
+  	   do
+  	     ++(*lolo);
+  	   while (lili
+  		  && lele);
+  	   lulu;
+         }
+
+  int main ()
+  {
+  switch (c)
+  {
+  case 'c': if (cond)
+  {
+  }
+  }
+  }
+
+  main()
+  {
+  	(void) MyFancyFuasdfadsfnction(
+  			argument);
+  }
+
+  main()
+  {
+  	char	foo[] = "/*";
+  	/* as
+  	df */
+  		hello
+  }
+
+  /* valid namespaces with normal indent */
+  namespace
+  {
+  {
+    111111111111;
+  }
+  }
+  namespace /* test */
+  {
+    11111111111111111;
+  }
+  namespace // test
+  {
+    111111111111111111;
+  }
+  namespace
+  {
+    111111111111111111;
+  }
+  namespace test
+  {
+    111111111111111111;
+  }
+  namespace{
+    111111111111111111;
+  }
+  namespace test{
+    111111111111111111;
+  }
+  namespace {
+    111111111111111111;
+  }
+  namespace test {
+    111111111111111111;
+  namespace test2 {
+    22222222222222222;
+  }
+  }
+
+  /* invalid namespaces use block indent */
+  namespace test test2 {
+    111111111111111111111;
+  }
+  namespace11111111111 {
+    111111111111;
+  }
+  namespace() {
+    1111111111111;
+  }
+  namespace()
+  {
+    111111111111111111;
+  }
+  namespace test test2
+  {
+    1111111111111111111;
+  }
+  namespace111111111
+  {
+    111111111111111111;
+  }
+
+  void getstring() {
+  /* Raw strings */
+  const char* s = R"(
+    test {
+      # comment
+      field: 123
+    }
+   )";
+       }
+
+  void getstring() {
+  const char* s = R"foo(
+    test {
+      # comment
+      field: 123
+    }
+      )foo";
+       }
+
+  {
+  int a[4] = {
+  [0] = 0,
+  [1] = 1,
+  [2] = 2,
+  [3] = 3,
+  };
+  }
+
+  {
+  a = b[2]
+  + 3;
+  }
+
+  {
+  if (1)
+  /* aaaaa
+  * bbbbb
+  */
+  a = 1;
+  }
+
+  void func()
+  {
+  switch (foo)
+  {
+  case (bar):
+  if (baz())
+  quux();
+  break;
+  case (shmoo):
+  if (!bar)
+  {
+  }
+  case (foo1):
+  switch (bar)
+  {
+  case baz:
+  baz_f();
+  break;
+  }
+  break;
+  default:
+  baz();
+  baz();
+  break;
+  }
+  }
+
+  /* end of AUTO */
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('start of AUTO')
+  exe "normal =/end of AUTO\<CR>"
+
+  let expected =<< trim [CODE]
+  /* start of AUTO matically checked vim: set ts=4 : */
+  {
+  	if (test)
+  		cmd1;
+  	cmd2;
+  }
+
+  {
+  	if (test)
+  		cmd1;
+  	else
+  		cmd2;
+  }
+
+  {
+  	if (test)
+  	{
+  		cmd1;
+  		cmd2;
+  	}
+  }
+
+  {
+  	if (test)
+  	{
+  		cmd1;
+  		else
+  	}
+  }
+
+  {
+  	while (this)
+  		if (test)
+  			cmd1;
+  	cmd2;
+  }
+
+  {
+  	while (this)
+  		if (test)
+  			cmd1;
+  		else
+  			cmd2;
+  }
+
+  {
+  	if (test)
+  	{
+  		cmd;
+  	}
+
+  	if (test)
+  		cmd;
+  }
+
+  {
+  	if (test) {
+  		cmd;
+  	}
+
+  	if (test) cmd;
+  }
+
+  {
+  	cmd1;
+  	for (blah)
+  		while (this)
+  			if (test)
+  				cmd2;
+  	cmd3;
+  }
+
+  {
+  	cmd1;
+  	for (blah)
+  		while (this)
+  			if (test)
+  				cmd2;
+  	cmd3;
+
+  	if (test)
+  	{
+  		cmd1;
+  		cmd2;
+  		cmd3;
+  	}
+  }
+
+
+  /* Test for 'cindent' do/while mixed with if/else: */
+
+  {
+  	do
+  		if (asdf)
+  			asdfasd;
+  	while (cond);
+
+  	do
+  		if (asdf)
+  			while (asdf)
+  				asdf;
+  	while (asdf);
+  }
+
+  /* Test for 'cindent' with two ) on a continuation line */
+  {
+  	if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
+  			aal;sdkjf  ( ;asldfkja;sldfk
+  				al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
+  		line up here;
+  }
+
+
+  /* C++ tests: */
+
+  // foo()		these three lines should remain in column 0
+  // {
+  // }
+
+  /* Test for continuation and unterminated lines: */
+  {
+  	i = 99 + 14325 +
+  		21345 +
+  		21345 +
+  		21345 + ( 21345 +
+  				21345) +
+  		2345 +
+  		1234;
+  	c = 1;
+  }
+
+  /*
+     testje for indent with empty line
+
+     here */
+
+  {
+  	if (testing &&
+  			not a joke ||
+  			line up here)
+  		hay;
+  	if (testing &&
+  			(not a joke || testing
+  			)line up here)
+  		hay;
+  	if (testing &&
+  			(not a joke || testing
+  			 line up here))
+  		hay;
+  }
+
+
+  {
+  	switch (c)
+  	{
+  		case xx:
+  			do
+  				if (asdf)
+  					do
+  						asdfasdf;
+  					while (asdf);
+  				else
+  					asdfasdf;
+  			while (cond);
+  		case yy:
+  		case xx:
+  		case zz:
+  			testing;
+  	}
+  }
+
+  {
+  	if (cond) {
+  		foo;
+  	}
+  	else
+  	{
+  		bar;
+  	}
+  }
+
+  {
+  	if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
+  				alsdkfj (asldk;fj
+  					awith cino=(0 ;lf this one goes to below the paren with ==
+  						;laksjfd ;lsakdjf ;alskdf asd)
+  					asdfasdf;)))
+  		asdfasdf;
+  }
+
+  	int
+  func(a, b)
+  	int a;
+  	int c;
+  {
+  	if (c1 && (c2 ||
+  				c3))
+  		foo;
+  	if (c1 &&
+  			(c2 || c3)
+  	   )
+  }
+
+  {
+  	while (asd)
+  	{
+  		if (asdf)
+  			if (test)
+  				if (that)
+  				{
+  					if (asdf)
+  						do
+  							cdasd;
+  						while (as
+  								df);
+  				}
+  				else
+  					if (asdf)
+  						asdf;
+  					else
+  						asdf;
+  		asdf;
+  	}
+  }
+
+  {
+  	s = "/*"; b = ';'
+  		s = "/*"; b = ';';
+  	a = b;
+  }
+
+  {
+  	switch (a)
+  	{
+  		case a:
+  			switch (t)
+  			{
+  				case 1:
+  					cmd;
+  					break;
+  				case 2:
+  					cmd;
+  					break;
+  			}
+  			cmd;
+  			break;
+  		case b:
+  			{
+  				int i;
+  				cmd;
+  			}
+  			break;
+  		case c: {
+  					int i;
+  					cmd;
+  				}
+  		case d: if (cond &&
+  						test) {		/* this line doesn't work right */
+  					int i;
+  					cmd;
+  				}
+  				break;
+  	}
+  }
+
+  {
+  	if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
+  			(bp_to->b_p_initialized ||
+  			 (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
+  		return;
+  label :
+  	asdf = asdf ?
+  		asdf : asdf;
+  	asdf = asdf ?
+  		asdf: asdf;
+  }
+
+  /* Special Comments	: This function has the added complexity (compared  */
+  /*					: to addtolist) of having to check for a detail     */
+  /*					: texture and add that to the list first.	 	    */
+
+  char *(array[100]) = {
+  	"testje",
+  	"foo",
+  	"bar",
+  }
+
+  enum soppie
+  {
+  	yes = 0,
+  	no,
+  	maybe
+  };
+
+  typedef enum soppie
+  {
+  	yes = 0,
+  	no,
+  	maybe
+  };
+
+  static enum
+  {
+  	yes = 0,
+  	no,
+  	maybe
+  } soppie;
+
+  public static enum
+  {
+  	yes = 0,
+  	no,
+  	maybe
+  } soppie;
+
+  static private enum
+  {
+  	yes = 0,
+  	no,
+  	maybe
+  } soppie;
+
+  {
+  	int a,
+  		b;
+  }
+
+  {
+  	struct Type
+  	{
+  		int i;
+  		char *str;
+  	} var[] =
+  	{
+  		0, "zero",
+  		1, "one",
+  		2, "two",
+  		3, "three"
+  	};
+
+  	float matrix[3][3] =
+  	{
+  		{
+  			0,
+  			1,
+  			2
+  		},
+  		{
+  			3,
+  			4,
+  			5
+  		},
+  		{
+  			6,
+  			7,
+  			8
+  		}
+  	};
+  }
+
+  {
+  	/* blah ( blah */
+  	/* where does this go? */
+
+  	/* blah ( blah */
+  	cmd;
+
+  	func(arg1,
+  			/* comment */
+  			arg2);
+  	a;
+  	{
+  		b;
+  		{
+  			c; /* Hey, NOW it indents?! */
+  		}
+  	}
+
+  	{
+  		func(arg1,
+  				arg2,
+  				arg3);
+  		/* Hey, what am I doing here?  Is this coz of the ","? */
+  	}
+  }
+
+  main ()
+  {
+  	if (cond)
+  	{
+  		a = b;
+  	}
+  	if (cond) {
+  		a = c;
+  	}
+  	if (cond)
+  		a = d;
+  	return;
+  }
+
+  {
+  	case 2: if (asdf &&
+  					asdfasdf)
+  				aasdf;
+  			a = 9;
+  	case 3: if (asdf)
+  				aasdf;
+  			a = 9;
+  	case 4:    x = 1;
+  			   y = 2;
+
+  label:	if (asdf)
+  			here;
+
+  label:  if (asdf &&
+  				asdfasdf)
+  		{
+  		}
+
+  label:  if (asdf &&
+  				asdfasdf) {
+  			there;
+  		}
+
+  label:  if (asdf &&
+  				asdfasdf)
+  			there;
+  }
+
+  {
+  	/*
+  	   hello with ":set comments= cino=c5"
+  	 */
+
+  	/*
+  	   hello with ":set comments= cino="
+  	 */
+  }
+
+
+  {
+  	if (a < b) {
+  		a = a + 1;
+  	} else
+  		a = a + 2;
+
+  	if (a)
+  		do {
+  			testing;
+  		} while (asdfasdf);
+  	a = b + 1;
+  	asdfasdf
+  }
+
+  {
+  	for ( int i = 0;
+  			i < 10; i++ )
+  	{
+  	}
+  	i = 0;
+  }
+
+  class bob
+  {
+  	int foo() {return 1;}
+  	int bar;
+  }
+
+  main()
+  {
+  	while(1)
+  		if (foo)
+  		{
+  			bar;
+  		}
+  		else {
+  			asdf;
+  		}
+  	misplacedline;
+  }
+
+  {
+  	if (clipboard.state == SELECT_DONE
+  			&& ((row == clipboard.start.lnum
+  					&& col >= clipboard.start.col)
+  				|| row > clipboard.start.lnum))
+  }
+
+  {
+  	if (1) {i += 4;}
+  	where_am_i;
+  	return 0;
+  }
+
+  {
+  	{
+  	} // sdf(asdf
+  	if (asdf)
+  		asd;
+  }
+
+  {
+  label1:
+  label2:
+  }
+
+  {
+  	int fooRet = foo(pBar1, false /*fKB*/,
+  			true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
+  	f() {
+  		for ( i = 0;
+  				i < m;
+  				/* c */ i++ ) {
+  			a = b;
+  		}
+  	}
+  }
+
+  {
+  	f1(/*comment*/);
+  	f2();
+  }
+
+  {
+  	do {
+  		if (foo) {
+  		} else
+  			;
+  	} while (foo);
+  	foo();	// was wrong
+  }
+
+  int x;	    // no extra indent because of the ;
+  void func()
+  {
+  }
+
+  char *tab[] = {"aaa",
+  	"};", /* }; */ NULL}
+  	int indented;
+  {}
+
+  char *a[] = {"aaa", "bbb",
+  	"ccc", NULL};
+  // here
+
+  char *tab[] = {"aaa",
+  	"xx", /* xx */};    /* asdf */
+  int not_indented;
+
+  {
+  	do {
+  		switch (bla)
+  		{
+  			case 1: if (foo)
+  						bar;
+  		}
+  	} while (boo);
+  	wrong;
+  }
+
+  int	foo,
+  	bar;
+  int foo;
+
+  #if defined(foo) \
+  	&& defined(bar)
+  char * xx = "asdf\
+  			 foo\
+  			 bor";
+  int x;
+
+  char    *foo = "asdf\
+  				asdf\
+  				asdf",
+  		*bar;
+
+  void f()
+  {
+  #if defined(foo) \
+  	&& defined(bar)
+  	char    *foo = "asdf\
+  					asdf\
+  					asdf",
+  			*bar;
+  	{
+  		int i;
+  		char    *foo = "asdf\
+  						asdf\
+  						asdf",
+  				*bar;
+  	}
+  #endif
+  }
+  #endif
+
+  int y;		// comment
+  // comment
+
+  // comment
+
+  {
+  	Constructor(int a,
+  			int b )  : BaseClass(a)
+  	{
+  	}
+  }
+
+  void foo()
+  {
+  	char one,
+  		 two;
+  	struct bla piet,
+  			   jan;
+  	enum foo kees,
+  			 jannie;
+  	static unsigned sdf,
+  					krap;
+  	unsigned int piet,
+  				 jan;
+  	int
+  		kees,
+  		jan;
+  }
+
+  {
+  	t(int f,
+  			int d);		// )
+  	d();
+  }
+
+  Constructor::Constructor(int a,
+  		int b 
+  		)  : 
+  	BaseClass(a,
+  			b,
+  			c),
+  	mMember(b),
+  {
+  }
+
+  Constructor::Constructor(int a,
+  		int b )  : 
+  	BaseClass(a)
+  {
+  }
+
+  Constructor::Constructor(int a,
+  		int b ) /*x*/ : /*x*/ BaseClass(a),
+  	member(b)
+  {
+  }
+
+  A::A(int a, int b)
+  	: aa(a),
+  	bb(b),
+  	cc(c)
+  {
+  }
+
+  class CAbc :
+  	public BaseClass1,
+  	protected BaseClass2
+  {
+  	int Test() { return FALSE; }
+  	int Test1() { return TRUE; }
+
+  	CAbc(int a, int b )  : 
+  		BaseClass(a)
+  	{ 
+  		switch(xxx)
+  		{
+  			case abc:
+  				asdf();
+  				break;
+
+  			case 999:
+  				baer();
+  				break;
+  		}
+  	}
+
+  	public: // <-- this was incoreectly indented before!!
+  	void testfall();
+  	protected:
+  	void testfall();
+  };
+
+  class CAbc : public BaseClass1,
+  	protected BaseClass2
+  {
+  };
+
+  static struct
+  {
+  	int a;
+  	int b;
+  } variable[COUNT] =
+  {
+  	{
+  		123,
+  		456
+  	},
+  	{
+  		123,
+  		456
+  	}
+  };
+
+  static struct
+  {
+  	int a;
+  	int b;
+  } variable[COUNT] =
+  {
+  	{ 123, 456 },
+  	{ 123, 456 }
+  };
+
+  void asdf()		/* ind_maxparen may cause trouble here */
+  {
+  	if ((0
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1
+  				&& 1)) break;
+  }
+
+  foo()
+  {
+  	a = cond ? foo() : asdf
+  		+ asdf;
+
+  	a = cond ?
+  		foo() : asdf
+  		+ asdf;
+  }
+
+  int  main(void)
+  {
+  	if (a)
+  		if (b)
+  			2;
+  		else 3;
+  	next_line_of_code();
+  }
+
+  barry()
+  {
+  	Foo::Foo (int one,
+  			int two)
+  		: something(4)
+  	{}
+  }
+
+  barry()
+  {
+  	Foo::Foo (int one, int two)
+  		: something(4)
+  	{}
+  }
+
+  Constructor::Constructor(int a,
+  		int b 
+  		)  : 
+  	BaseClass(a,
+  			b,
+  			c),
+  	mMember(b)
+  {
+  }
+  int main ()
+  {
+  	if (lala)
+  		do
+  			++(*lolo);
+  		while (lili
+  				&& lele);
+  	lulu;
+  }
+
+  int main ()
+  {
+  	switch (c)
+  	{
+  		case 'c': if (cond)
+  				  {
+  				  }
+  	}
+  }
+
+  main()
+  {
+  	(void) MyFancyFuasdfadsfnction(
+  			argument);
+  }
+
+  main()
+  {
+  	char	foo[] = "/*";
+  	/* as
+  	   df */
+  	hello
+  }
+
+  /* valid namespaces with normal indent */
+  namespace
+  {
+  	{
+  		111111111111;
+  	}
+  }
+  namespace /* test */
+  {
+  	11111111111111111;
+  }
+  namespace // test
+  {
+  	111111111111111111;
+  }
+  namespace
+  {
+  	111111111111111111;
+  }
+  namespace test
+  {
+  	111111111111111111;
+  }
+  namespace{
+  	111111111111111111;
+  }
+  namespace test{
+  	111111111111111111;
+  }
+  namespace {
+  	111111111111111111;
+  }
+  namespace test {
+  	111111111111111111;
+  	namespace test2 {
+  		22222222222222222;
+  	}
+  }
+
+  /* invalid namespaces use block indent */
+  namespace test test2 {
+  	111111111111111111111;
+  }
+  namespace11111111111 {
+  	111111111111;
+  }
+  namespace() {
+  	1111111111111;
+  }
+  namespace()
+  {
+  	111111111111111111;
+  }
+  namespace test test2
+  {
+  	1111111111111111111;
+  }
+  namespace111111111
+  {
+  	111111111111111111;
+  }
+
+  void getstring() {
+  	/* Raw strings */
+  	const char* s = R"(
+    test {
+      # comment
+      field: 123
+    }
+   )";
+  }
+
+  void getstring() {
+  	const char* s = R"foo(
+    test {
+      # comment
+      field: 123
+    }
+      )foo";
+  }
+
+  {
+  	int a[4] = {
+  		[0] = 0,
+  		[1] = 1,
+  		[2] = 2,
+  		[3] = 3,
+  	};
+  }
+
+  {
+  	a = b[2]
+  		+ 3;
+  }
+
+  {
+  	if (1)
+  		/* aaaaa
+  		 * bbbbb
+  		 */
+  		a = 1;
+  }
+
+  void func()
+  {
+  	switch (foo)
+  	{
+  		case (bar):
+  			if (baz())
+  				quux();
+  			break;
+  		case (shmoo):
+  			if (!bar)
+  			{
+  			}
+  		case (foo1):
+  			switch (bar)
+  			{
+  				case baz:
+  					baz_f();
+  					break;
+  			}
+  			break;
+  		default:
+  			baz();
+  			baz();
+  			break;
+  	}
+  }
+
+  /* end of AUTO */
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_2()
+  new
+  setl cindent ts=4 sw=4
+  setl tw=0 noai fo=croq
+  let &wm = &columns - 20
+
+  let code =<< trim [CODE]
+  {
+
+  /* this is
+   * a real serious important big
+   * comment
+   */
+  	/* insert " about life, the universe, and the rest" after "serious" */
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('serious', 'e')
+  normal a about life, the universe, and the rest
+
+  let expected =<< trim [CODE]
+  {
+
+  /* this is
+   * a real serious
+   * about life, the
+   * universe, and the
+   * rest important big
+   * comment
+   */
+  	/* insert " about life, the universe, and the rest" after "serious" */
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  set wm&
+  enew! | close
+endfunc
+
+func Test_cindent_3()
+  new
+  setl nocindent ts=4 sw=4
+
+  let code =<< trim [CODE]
+  {
+  	/*
+  	 * Testing for comments, without 'cin' set
+  	 */
+
+  /*
+  * what happens here?
+  */
+
+  	/*
+  	   the end of the comment, try inserting a line below */
+
+  		/* how about
+  		                this one */
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('comments')
+  normal joabout life
+  call search('happens')
+  normal jothere
+  call search('below')
+  normal oline
+  call search('this')
+  normal Ohello
+
+  let expected =<< trim [CODE]
+  {
+  	/*
+  	 * Testing for comments, without 'cin' set
+  	 */
+  about life
+
+  /*
+  * what happens here?
+  */
+  there
+
+  	/*
+  	   the end of the comment, try inserting a line below */
+  line
+
+  		/* how about
+  hello
+  		                this one */
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_4()
+  new
+  setl cindent ts=4 sw=4
+
+  let code =<< trim [CODE]
+  {
+      var = this + that + vec[0] * vec[0]
+  				      + vec[1] * vec[1]
+  					  + vec2[2] * vec[2];
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('vec2')
+  normal ==
+
+  let expected =<< trim [CODE]
+  {
+      var = this + that + vec[0] * vec[0]
+  				      + vec[1] * vec[1]
+  					  + vec2[2] * vec[2];
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_5()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=}4
+
+  let code =<< trim [CODE]
+  {
+  		asdf asdflkajds f;
+  	if (tes & ting) {
+  		asdf asdf asdf ;
+  		asdfa sdf asdf;
+  		}
+  	testing1;
+  	if (tes & ting)
+  	{
+  		asdf asdf asdf ;
+  		asdfa sdf asdf;
+  		}
+  	testing2;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('testing1')
+  exe "normal k2==/testing2\<CR>"
+  normal k2==
+
+  let expected =<< trim [CODE]
+  {
+  		asdf asdflkajds f;
+  	if (tes & ting) {
+  		asdf asdf asdf ;
+  		asdfa sdf asdf;
+  		}
+  	testing1;
+  	if (tes & ting)
+  	{
+  		asdf asdf asdf ;
+  		asdfa sdf asdf;
+  		}
+  	testing2;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_6()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(0,)20
+
+  let code =<< trim [CODE]
+  main ( int first_par, /*
+                         * Comment for
+                         * first par
+                         */
+            int second_par /*
+                         * Comment for
+                         * second par
+                         */
+       )
+  {
+  	func( first_par, /*
+                        * Comment for
+                        * first par
+                        */
+      second_par /*
+                        * Comment for
+                        * second par
+                        */
+          );
+
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('main')
+  normal =][
+
+  let expected =<< trim [CODE]
+  main ( int first_par, /*
+  					   * Comment for
+  					   * first par
+  					   */
+  	   int second_par /*
+  					   * Comment for
+  					   * second par
+  					   */
+  	 )
+  {
+  	func( first_par, /*
+  					  * Comment for
+  					  * first par
+  					  */
+  		  second_par /*
+  					  * Comment for
+  					  * second par
+  					  */
+  		);
+
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_7()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=es,n0s
+
+  let code =<< trim [CODE]
+  main(void)
+  {
+  	/* Make sure that cino=X0s is not parsed like cino=Xs. */
+  	if (cond)
+  		foo();
+  	else
+  	{
+  		bar();
+  	}
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('main')
+  normal =][
+
+  let expected =<< trim [CODE]
+  main(void)
+  {
+  	/* Make sure that cino=X0s is not parsed like cino=Xs. */
+  	if (cond)
+  		foo();
+  	else
+  	{
+  		bar();
+  	}
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_8()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=
+
+  let code =<< trim [CODE]
+
+  {
+  	do
+  	{
+  		if ()
+  		{
+  			if ()
+  				asdf;
+  			else
+  				asdf;
+  		}
+  	} while ();
+  			cmd;		/* this should go under the } */
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+
+  {
+  	do
+  	{
+  		if ()
+  		{
+  			if ()
+  				asdf;
+  			else
+  				asdf;
+  		}
+  	} while ();
+  	cmd;		/* this should go under the } */
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_9()
+  new
+  setl cindent ts=4 sw=4
+
+  let code =<< trim [CODE]
+
+  void f()
+  {
+      if ( k() ) {
+          l();
+
+      } else { /* Start (two words) end */
+          m();
+      }
+
+      n();
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+
+  void f()
+  {
+  	if ( k() ) {
+  		l();
+
+  	} else { /* Start (two words) end */
+  		m();
+  	}
+
+  	n();
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_10()
+  new
+  setl cindent ts=4 sw=4
+  setl cino={s,e-s
+
+  let code =<< trim [CODE]
+
+  void f()
+  {
+      if ( k() )
+  	{
+          l();
+      } else { /* Start (two words) end */
+          m();
+      }
+  		n();	/* should be under the if () */
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+
+  void f()
+  {
+  	if ( k() )
+  		{
+  		l();
+  		} else { /* Start (two words) end */
+  		m();
+  		}
+  	n();	/* should be under the if () */
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_11()
+  new
+  setl cindent ts=4 sw=4
+  setl cino={s,fs
+
+  let code =<< trim [CODE]
+  void bar(void)
+  {
+  	static array[2][2] =
+  	{
+  		{ 1, 2 },
+  		{ 3, 4 },
+  	}
+
+  	while (a)
+  	{
+  		foo(&a);
+  	}
+
+  	{
+  		int a;
+  		{
+  			a = a + 1;
+  		}
+  	}
+  	b = a;
+  	}
+
+  void func(void)
+  	{
+  	a = 1;
+  	{
+  		b = 2;
+  	}
+  	c = 3;
+  	d = 4;
+  	}
+  /* foo */
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  exe "normal ]]=/ foo\<CR>"
+
+  let expected =<< trim [CODE]
+  void bar(void)
+  	{
+  	static array[2][2] =
+  		{
+  			{ 1, 2 },
+  			{ 3, 4 },
+  		}
+
+  	while (a)
+  		{
+  		foo(&a);
+  		}
+
+  		{
+  		int a;
+  			{
+  			a = a + 1;
+  			}
+  		}
+  	b = a;
+  	}
+
+  void func(void)
+  	{
+  	a = 1;
+  		{
+  		b = 2;
+  		}
+  	c = 3;
+  	d = 4;
+  	}
+  /* foo */
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_12()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=
+
+  let code =<< trim [CODE]
+  a()
+  {
+    do {
+      a = a +
+        a;
+    } while ( a );		/* add text under this line */
+      if ( a )
+        a;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('while')
+  normal ohere
+
+  let expected =<< trim [CODE]
+  a()
+  {
+    do {
+      a = a +
+        a;
+    } while ( a );		/* add text under this line */
+    here
+      if ( a )
+        a;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_13()
+  new
+  setl cindent ts=4 sw=4
+  setl cino= com=
+
+  let code =<< trim [CODE]
+  a()
+  {
+  label1:
+              /* hmm */
+              // comment
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('comment')
+  exe "normal olabel2: b();\rlabel3 /* post */:\r/* pre */ label4:\r" .
+        \ "f(/*com*/);\rif (/*com*/)\rcmd();"
+
+  let expected =<< trim [CODE]
+  a()
+  {
+  label1:
+              /* hmm */
+              // comment
+  label2: b();
+  label3 /* post */:
+  /* pre */ label4:
+  		f(/*com*/);
+  		if (/*com*/)
+  			cmd();
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_14()
+  new
+  setl cindent ts=4 sw=4
+  setl comments& comments^=s:/*,m:**,ex:*/
+
+  let code =<< trim [CODE]
+  /*
+    * A simple comment
+     */
+
+  /*
+    ** A different comment
+     */
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('simple')
+  normal =5j
+
+  let expected =<< trim [CODE]
+  /*
+   * A simple comment
+   */
+
+  /*
+  ** A different comment
+  */
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_15()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=c0
+  setl comments& comments-=s1:/* comments^=s0:/*
+
+  let code =<< trim [CODE]
+  void f()
+  {
+
+  	/*********
+    A comment.
+  *********/
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+
+  	/*********
+  	  A comment.
+  	*********/
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_16()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=c0,C1
+  setl comments& comments-=s1:/* comments^=s0:/*
+
+  let code =<< trim [CODE]
+  void f()
+  {
+
+  	/*********
+    A comment.
+  *********/
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+
+  	/*********
+  	A comment.
+  	*********/
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_17()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	c = c1 &&
+  	(
+  	c2 ||
+  	c3
+  	) && c4;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	c = c1 &&
+  		(
+  		 c2 ||
+  		 c3
+  		) && c4;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_18()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(s
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	c = c1 &&
+  	(
+  	c2 ||
+  	c3
+  	) && c4;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	c = c1 &&
+  		(
+  		 c2 ||
+  		 c3
+  		) && c4;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_19()
+  new
+  setl cindent ts=4 sw=4
+  set cino=(s,U1
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	c = c1 &&
+  	(
+  	c2 ||
+  	c3
+  	) && c4;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	c = c1 &&
+  		(
+  			c2 ||
+  			c3
+  		) && c4;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_20()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(0
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	if (   c1
+  	&& (   c2
+  	|| c3))
+  	foo;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	if (   c1
+  		   && (   c2
+  				  || c3))
+  		foo;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_21()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(0,w1
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	if (   c1
+  	&& (   c2
+  	|| c3))
+  	foo;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	if (   c1
+  		&& (   c2
+  			|| c3))
+  		foo;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_22()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(s
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	c = c1 && (
+  	c2 ||
+  	c3
+  	) && c4;
+  	if (
+  	c1 && c2
+  	)
+  	foo;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	c = c1 && (
+  		c2 ||
+  		c3
+  		) && c4;
+  	if (
+  		c1 && c2
+  	   )
+  		foo;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_23()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(s,m1
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	c = c1 && (
+  	c2 ||
+  	c3
+  	) && c4;
+  	if (
+  	c1 && c2
+  	)
+  	foo;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	c = c1 && (
+  		c2 ||
+  		c3
+  	) && c4;
+  	if (
+  		c1 && c2
+  	)
+  		foo;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_24()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=b1
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	switch (x)
+  	{
+  		case 1:
+  			a = b;
+  			break;
+  		default:
+  			a = 0;
+  			break;
+  	}
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	switch (x)
+  	{
+  		case 1:
+  			a = b;
+  		break;
+  		default:
+  			a = 0;
+  		break;
+  	}
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_25()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(0,W5
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	invokeme(
+  	argu,
+  	ment);
+  	invokeme(
+  	argu,
+  	ment
+  	);
+  	invokeme(argu,
+  	ment
+  	);
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	invokeme(
+  		 argu,
+  		 ment);
+  	invokeme(
+  		 argu,
+  		 ment
+  		 );
+  	invokeme(argu,
+  			 ment
+  			);
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_26()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=/6
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	statement;
+  		// comment 1
+  	// comment 2
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	statement;
+  		  // comment 1
+  		  // comment 2
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_27()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=
+
+  let code =<< trim [CODE]
+  void f()
+  {
+  	statement;
+  	   // comment 1
+  	// comment 2
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  exe "normal ]]/comment 1/+1\<CR>=="
+
+  let expected =<< trim [CODE]
+  void f()
+  {
+  	statement;
+  	   // comment 1
+  	   // comment 2
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_28()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=g0
+
+  let code =<< trim [CODE]
+  class CAbc
+  {
+     int Test() { return FALSE; }
+
+  public: // comment
+     void testfall();
+  protected:
+     void testfall();
+  };
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  class CAbc
+  {
+  	int Test() { return FALSE; }
+
+  public: // comment
+  	void testfall();
+  protected:
+  	void testfall();
+  };
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_29()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(0,gs,hs
+
+  let code =<< trim [CODE]
+  class Foo : public Bar
+  {
+  public:
+  virtual void method1(void) = 0;
+  virtual void method2(int arg1,
+  int arg2,
+  int arg3) = 0;
+  };
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  class Foo : public Bar
+  {
+  	public:
+  		virtual void method1(void) = 0;
+  		virtual void method2(int arg1,
+  							 int arg2,
+  							 int arg3) = 0;
+  };
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_30()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=+20
+
+  let code =<< trim [CODE]
+  	void
+  foo()
+  {
+  	if (a)
+  	{
+  	} else
+  		asdf;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  	void
+  foo()
+  {
+  	if (a)
+  	{
+  	} else
+  		asdf;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_31()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(0,W2s
+
+  let code =<< trim [CODE]
+
+  {
+     averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
+           asdasdf,
+           func(asdf,
+                asdfadsf),
+           asdfasdf
+           );
+
+     /* those are ugly, but consequent */
+
+     func()->asd(asdasdf,
+                 averylongfunctionname(
+                       abc,
+                       dec)->averylongfunctionname(
+                             asdfadsf,
+                             asdfasdf,
+                             asdfasdf,
+                             ),
+                 func(asdfadf,
+                      asdfasdf
+                     ),
+                 asdasdf
+                );
+
+     averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
+                 abc,
+                 dec)->asdfasdfasdf(
+                       asdfadsf,
+                       asdfasdf,
+                       asdfasdf,
+                       ),
+           func(asdfadf,
+                asdfasdf),
+           asdasdf
+           );
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+
+  {
+  	averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
+  			asdasdf,
+  			func(asdf,
+  				 asdfadsf),
+  			asdfasdf
+  			);
+
+  	/* those are ugly, but consequent */
+
+  	func()->asd(asdasdf,
+  				averylongfunctionname(
+  						abc,
+  						dec)->averylongfunctionname(
+  								asdfadsf,
+  								asdfasdf,
+  								asdfasdf,
+  								),
+  				func(asdfadf,
+  					 asdfasdf
+  					),
+  				asdasdf
+  			   );
+
+  	averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
+  					abc,
+  					dec)->asdfasdfasdf(
+  							asdfadsf,
+  							asdfasdf,
+  							asdfasdf,
+  							),
+  			func(asdfadf,
+  				 asdfasdf),
+  			asdasdf
+  			);
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_32()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=M1
+
+  let code =<< trim [CODE]
+  int main ()
+  {
+  	if (cond1 &&
+  			cond2
+  			)
+  		foo;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  int main ()
+  {
+  	if (cond1 &&
+  			cond2
+  			)
+  		foo;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_33()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(0,ts
+
+  let code =<< trim [CODE]
+  void func(int a
+  #if defined(FOO)
+  		  , int b
+  		  , int c
+  #endif
+  		 )
+  {
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal 2j=][
+
+  let expected =<< trim [CODE]
+  void func(int a
+  #if defined(FOO)
+  		  , int b
+  		  , int c
+  #endif
+  		 )
+  {
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_34()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=(0
+
+  let code =<< trim [CODE]
+
+  void
+  func(int a
+  #if defined(FOO)
+  		  , int b
+  		  , int c
+  #endif
+  		 )
+  {
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal =][
+
+  let expected =<< trim [CODE]
+
+  	void
+  func(int a
+  #if defined(FOO)
+  	 , int b
+  	 , int c
+  #endif
+  	)
+  {
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_35()
+  new
+  setl cindent ts=4 sw=4
+  setl cino&
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	if(x==y)
+  		if(y==z)
+  			foo=1;
+  		else { bar=1;
+  			baz=2;
+  		}
+  	printf("Foo!\n");
+  }
+
+  void func1(void)
+  {
+  	char* tab[] = {"foo", "bar",
+  		"baz", "quux",
+  			"this line used", "to be indented incorrectly"};
+  	foo();
+  }
+
+  void func2(void)
+  {
+  	int tab[] =
+  	{1, 2,
+  		3, 4,
+  		5, 6};
+
+  		printf("This line used to be indented incorrectly.\n");
+  }
+
+  int foo[]
+  #ifdef BAR
+
+  = { 1, 2, 3,
+  	4, 5, 6 }
+
+  #endif
+  ;
+  	int baz;
+
+  void func3(void)
+  {
+  	int tab[] = {
+  	1, 2,
+  	3, 4,
+  	5, 6};
+
+  printf("Don't you dare indent this line incorrectly!\n");
+  }
+
+  void
+  func4(a, b,
+  		c)
+  int a;
+  int b;
+  int c;
+  {
+  }
+
+  void
+  func5(
+  		int a,
+  		int b)
+  {
+  }
+
+  void
+  func6(
+  		int a)
+  {
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=7][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	if(x==y)
+  		if(y==z)
+  			foo=1;
+  		else { bar=1;
+  			baz=2;
+  		}
+  	printf("Foo!\n");
+  }
+
+  void func1(void)
+  {
+  	char* tab[] = {"foo", "bar",
+  		"baz", "quux",
+  		"this line used", "to be indented incorrectly"};
+  	foo();
+  }
+
+  void func2(void)
+  {
+  	int tab[] =
+  	{1, 2,
+  		3, 4,
+  		5, 6};
+
+  	printf("This line used to be indented incorrectly.\n");
+  }
+
+  int foo[]
+  #ifdef BAR
+
+  = { 1, 2, 3,
+  	4, 5, 6 }
+
+  #endif
+  	;
+  int baz;
+
+  void func3(void)
+  {
+  	int tab[] = {
+  		1, 2,
+  		3, 4,
+  		5, 6};
+
+  	printf("Don't you dare indent this line incorrectly!\n");
+  }
+
+  	void
+  func4(a, b,
+  		c)
+  	int a;
+  	int b;
+  	int c;
+  {
+  }
+
+  	void
+  func5(
+  		int a,
+  		int b)
+  {
+  }
+
+  	void
+  func6(
+  		int a)
+  {
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_36()
+  new
+  setl cindent ts=4 sw=4
+  setl cino&
+  setl cino+=l1
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	int tab[] =
+  	{
+  		1, 2, 3,
+  		4, 5, 6};
+
+  	printf("Indent this line correctly!\n");
+
+  	switch (foo)
+  	{
+  		case bar:
+  			printf("bar");
+  			break;
+  		case baz: {
+  			printf("baz");
+  			break;
+  		}
+  		case quux:
+  printf("But don't break the indentation of this instruction\n");
+  break;
+  	}
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	int tab[] =
+  	{
+  		1, 2, 3,
+  		4, 5, 6};
+
+  	printf("Indent this line correctly!\n");
+
+  	switch (foo)
+  	{
+  		case bar:
+  			printf("bar");
+  			break;
+  		case baz: {
+  			printf("baz");
+  			break;
+  		}
+  		case quux:
+  			printf("But don't break the indentation of this instruction\n");
+  			break;
+  	}
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_37()
+  new
+  setl cindent ts=4 sw=4
+  setl cino&
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	cout << "a"
+  	<< "b"
+  	<< ") :"
+  	<< "c";
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	cout << "a"
+  		<< "b"
+  		<< ") :"
+  		<< "c";
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_38()
+  new
+  setl cindent ts=4 sw=4
+  setl com=s1:/*,m:*,ex:*/
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	/*
+  	 * This is a comment.
+  	 */
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]3jofoo();
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	/*
+  	 * This is a comment.
+  	 */
+  	foo();
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_39()
+  new
+  setl cindent ts=4 sw=4
+  setl cino&
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	for (int i = 0; i < 10; ++i)
+  		if (i & 1) {
+  			foo(1);
+  		} else
+  			foo(0);
+  baz();
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	for (int i = 0; i < 10; ++i)
+  		if (i & 1) {
+  			foo(1);
+  		} else
+  			foo(0);
+  	baz();
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_40()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=k2s,(0
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  	&& condition2)
+  	action();
+  	function(argument1
+  	&& argument2);
+
+  	if (c1 && (c2 ||
+  	c3))
+  	foo;
+  	if (c1 &&
+  	(c2 || c3))
+  	{
+  	}
+
+  	if (   c1
+  	&& (      c2
+  	|| c3))
+  	foo;
+  	func( c1
+  	&& (     c2
+  	|| c3))
+  	foo;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  			&& condition2)
+  		action();
+  	function(argument1
+  			 && argument2);
+
+  	if (c1 && (c2 ||
+  				c3))
+  		foo;
+  	if (c1 &&
+  			(c2 || c3))
+  	{
+  	}
+
+  	if (   c1
+  			&& (      c2
+  					  || c3))
+  		foo;
+  	func( c1
+  		  && (     c2
+  				   || c3))
+  		foo;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_41()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=k2s,(s
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  	&& condition2)
+  	action();
+  	function(argument1
+  	&& argument2);
+
+  	if (c1 && (c2 ||
+  	c3))
+  	foo;
+  	if (c1 &&
+  	(c2 || c3))
+  	{
+  	}
+
+  	if (   c1
+  	&& (      c2
+  	|| c3))
+  	foo;
+  	func(   c1
+  	&& (      c2
+  	|| c3))
+  	foo;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  			&& condition2)
+  		action();
+  	function(argument1
+  		&& argument2);
+
+  	if (c1 && (c2 ||
+  				c3))
+  		foo;
+  	if (c1 &&
+  			(c2 || c3))
+  	{
+  	}
+
+  	if (   c1
+  			&& (      c2
+  				|| c3))
+  		foo;
+  	func(   c1
+  		&& (      c2
+  			|| c3))
+  		foo;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_42()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=k2s,(s,U1
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  	&& condition2)
+  	action();
+  	function(argument1
+  	&& argument2);
+
+  	if (c1 && (c2 ||
+  	c3))
+  	foo;
+  	if (c1 &&
+  	(c2 || c3))
+  	{
+  	}
+  	if (c123456789
+  	&& (c22345
+  	|| c3))
+  	printf("foo\n");
+
+  	c = c1 &&
+  	(
+  	c2 ||
+  	c3
+  	) && c4;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  			&& condition2)
+  		action();
+  	function(argument1
+  		&& argument2);
+
+  	if (c1 && (c2 ||
+  				c3))
+  		foo;
+  	if (c1 &&
+  			(c2 || c3))
+  	{
+  	}
+  	if (c123456789
+  			&& (c22345
+  				|| c3))
+  		printf("foo\n");
+
+  	c = c1 &&
+  		(
+  			c2 ||
+  			c3
+  		) && c4;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_43()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=k2s,(0,W4
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  	&& condition2)
+  	action();
+  	function(argument1
+  	&& argument2);
+
+  	if (c1 && (c2 ||
+  	c3))
+  	foo;
+  	if (c1 &&
+  	(c2 || c3))
+  	{
+  	}
+  	if (c123456789
+  	&& (c22345
+  	|| c3))
+  	printf("foo\n");
+
+  	if (   c1
+  	&& (   c2
+  	|| c3))
+  	foo;
+
+  	a_long_line(
+  	argument,
+  	argument);
+  	a_short_line(argument,
+  	argument);
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  			&& condition2)
+  		action();
+  	function(argument1
+  			 && argument2);
+
+  	if (c1 && (c2 ||
+  				c3))
+  		foo;
+  	if (c1 &&
+  			(c2 || c3))
+  	{
+  	}
+  	if (c123456789
+  			&& (c22345
+  				|| c3))
+  		printf("foo\n");
+
+  	if (   c1
+  			&& (   c2
+  				   || c3))
+  		foo;
+
+  	a_long_line(
+  		argument,
+  		argument);
+  	a_short_line(argument,
+  				 argument);
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_44()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=k2s,u2
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  	&& condition2)
+  	action();
+  	function(argument1
+  	&& argument2);
+
+  	if (c1 && (c2 ||
+  	c3))
+  	foo;
+  	if (c1 &&
+  	(c2 || c3))
+  	{
+  	}
+  	if (c123456789
+  	&& (c22345
+  	|| c3))
+  	printf("foo\n");
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  			&& condition2)
+  		action();
+  	function(argument1
+  			&& argument2);
+
+  	if (c1 && (c2 ||
+  			  c3))
+  		foo;
+  	if (c1 &&
+  			(c2 || c3))
+  	{
+  	}
+  	if (c123456789
+  			&& (c22345
+  			  || c3))
+  		printf("foo\n");
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_45()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=k2s,(0,w1
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  	&& condition2)
+  	action();
+  	function(argument1
+  	&& argument2);
+
+  	if (c1 && (c2 ||
+  	c3))
+  	foo;
+  	if (c1 &&
+  	(c2 || c3))
+  	{
+  	}
+  	if (c123456789
+  	&& (c22345
+  	|| c3))
+  	printf("foo\n");
+
+  	if (   c1
+  	&& (      c2
+  	|| c3))
+  	foo;
+  	func(   c1
+  	&& (      c2
+  	|| c3))
+  	foo;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  			&& condition2)
+  		action();
+  	function(argument1
+  			 && argument2);
+
+  	if (c1 && (c2 ||
+  				c3))
+  		foo;
+  	if (c1 &&
+  			(c2 || c3))
+  	{
+  	}
+  	if (c123456789
+  			&& (c22345
+  				|| c3))
+  		printf("foo\n");
+
+  	if (   c1
+  			&& (      c2
+  				|| c3))
+  		foo;
+  	func(   c1
+  		 && (      c2
+  			 || c3))
+  		foo;
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_46()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=k2,(s
+
+  let code =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  	  && condition2)
+  		action();
+  	function(argument1
+  		&& argument2);
+
+  	if (c1 && (c2 ||
+  		  c3))
+  		foo;
+  	if (c1 &&
+  	  (c2 || c3))
+  	{
+  	}
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  normal ]]=][
+
+  let expected =<< trim [CODE]
+  void func(void)
+  {
+  	if (condition1
+  	  && condition2)
+  		action();
+  	function(argument1
+  		&& argument2);
+
+  	if (c1 && (c2 ||
+  		  c3))
+  		foo;
+  	if (c1 &&
+  	  (c2 || c3))
+  	{
+  	}
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_47()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=N-s
+
+  let code =<< trim [CODE]
+  NAMESPACESTART
+  /* valid namespaces with normal indent */
+  namespace
+  {
+     {
+  	111111111111;
+  }
+  }
+  namespace /* test */
+  {
+    11111111111111111;
+  }
+  namespace // test
+  {
+    111111111111111111;
+  }
+  namespace
+  {
+    111111111111111111;
+  }
+  namespace test
+  {
+    111111111111111111;
+  }
+  namespace test::cpp17
+  {
+    111111111111111111;
+  }
+  namespace ::incorrectcpp17
+  {
+    111111111111111111;
+  }
+  namespace test::incorrectcpp17::
+  {
+    111111111111111111;
+  }
+  namespace test:incorrectcpp17
+  {
+    111111111111111111;
+  }
+  namespace test:::incorrectcpp17
+  {
+    111111111111111111;
+  }
+  namespace{
+    111111111111111111;
+  }
+  namespace test{
+    111111111111111111;
+  }
+  namespace {
+    111111111111111111;
+  }
+  namespace test {
+    111111111111111111;
+  namespace test2 {
+    22222222222222222;
+  }
+  }
+
+  /* invalid namespaces use block indent */
+  namespace test test2 {
+    111111111111111111111;
+  }
+  namespace11111111111 {
+    111111111111;
+  }
+  namespace() {
+    1111111111111;
+  }
+  namespace()
+  {
+    111111111111111111;
+  }
+  namespace test test2
+  {
+    1111111111111111111;
+  }
+  namespace111111111
+  {
+    111111111111111111;
+  }
+  NAMESPACEEND
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('^NAMESPACESTART')
+  exe "normal =/^NAMESPACEEND\n"
+
+  let expected =<< trim [CODE]
+  NAMESPACESTART
+  /* valid namespaces with normal indent */
+  namespace
+  {
+  {
+  	111111111111;
+  }
+  }
+  namespace /* test */
+  {
+  11111111111111111;
+  }
+  namespace // test
+  {
+  111111111111111111;
+  }
+  namespace
+  {
+  111111111111111111;
+  }
+  namespace test
+  {
+  111111111111111111;
+  }
+  namespace test::cpp17
+  {
+  111111111111111111;
+  }
+  namespace ::incorrectcpp17
+  {
+  	111111111111111111;
+  }
+  namespace test::incorrectcpp17::
+  {
+  	111111111111111111;
+  }
+  namespace test:incorrectcpp17
+  {
+  	111111111111111111;
+  }
+  namespace test:::incorrectcpp17
+  {
+  	111111111111111111;
+  }
+  namespace{
+  111111111111111111;
+  }
+  namespace test{
+  111111111111111111;
+  }
+  namespace {
+  111111111111111111;
+  }
+  namespace test {
+  111111111111111111;
+  namespace test2 {
+  22222222222222222;
+  }
+  }
+
+  /* invalid namespaces use block indent */
+  namespace test test2 {
+  	111111111111111111111;
+  }
+  namespace11111111111 {
+  	111111111111;
+  }
+  namespace() {
+  	1111111111111;
+  }
+  namespace()
+  {
+  	111111111111111111;
+  }
+  namespace test test2
+  {
+  	1111111111111111111;
+  }
+  namespace111111111
+  {
+  	111111111111111111;
+  }
+  NAMESPACEEND
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_48()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=j1,J1
+
+  let code =<< trim [CODE]
+  JSSTART
+  var bar = {
+  foo: {
+  that: this,
+  some: ok,
+  },
+  "bar":{
+  a : 2,
+  b: "123abc",
+  x: 4,
+  "y": 5
+  }
+  }
+  JSEND
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('^JSSTART')
+  exe "normal =/^JSEND\n"
+
+  let expected =<< trim [CODE]
+  JSSTART
+  var bar = {
+  	foo: {
+  		that: this,
+  		some: ok,
+  	},
+  	"bar":{
+  		a : 2,
+  		b: "123abc",
+  		x: 4,
+  		"y": 5
+  	}
+  }
+  JSEND
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_49()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=j1,J1
+
+  let code =<< trim [CODE]
+  JSSTART
+  var foo = [
+  1,
+  2,
+  3
+  ];
+  JSEND
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('^JSSTART')
+  exe "normal =/^JSEND\n"
+
+  let expected =<< trim [CODE]
+  JSSTART
+  var foo = [
+  	1,
+  	2,
+  	3
+  ];
+  JSEND
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_50()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=j1,J1
+
+  let code =<< trim [CODE]
+  JSSTART
+  function bar() {
+  var foo = [
+  1,
+  2,
+  3
+  ];
+  }
+  JSEND
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('^JSSTART')
+  exe "normal =/^JSEND\n"
+
+  let expected =<< trim [CODE]
+  JSSTART
+  function bar() {
+  	var foo = [
+  		1,
+  		2,
+  		3
+  	];
+  }
+  JSEND
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_51()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=j1,J1
+
+  let code =<< trim [CODE]
+  JSSTART
+  (function($){
+
+  if (cond &&
+  cond) {
+  stmt;
+  }
+  window.something.left =
+  (width - 50 + offset) + "px";
+  var class_name='myclass';
+
+  function private_method() {
+  }
+
+  var public_method={
+  method: function(options,args){
+  private_method();
+  }
+  }
+
+  function init(options) {
+
+  $(this).data(class_name+'_public',$.extend({},{
+  foo: 'bar',
+  bar: 2,
+  foobar: [
+  1,
+  2,
+  3
+  ],
+  callback: function(){
+  return true;
+  }
+  }, options||{}));
+  }
+
+  $.fn[class_name]=function() {
+
+  var _arguments=arguments;
+  return this.each(function(){
+
+  var options=$(this).data(class_name+'_public');
+  if (!options) {
+  init.apply(this,_arguments);
+
+  } else {
+  var method=public_method[_arguments[0]];
+
+  if (typeof(method)!='function') {
+  console.log(class_name+' has no method "'+_arguments[0]+'"');
+  return false;
+  }
+  _arguments[0]=options;
+  method.apply(this,_arguments);
+  }
+  });
+  }
+
+  })(jQuery);
+  JSEND
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('^JSSTART')
+  exe "normal =/^JSEND\n"
+
+  let expected =<< trim [CODE]
+  JSSTART
+  (function($){
+
+  	if (cond &&
+  			cond) {
+  		stmt;
+  	}
+  	window.something.left =
+  		(width - 50 + offset) + "px";
+  	var class_name='myclass';
+
+  	function private_method() {
+  	}
+
+  	var public_method={
+  		method: function(options,args){
+  			private_method();
+  		}
+  	}
+
+  	function init(options) {
+
+  		$(this).data(class_name+'_public',$.extend({},{
+  			foo: 'bar',
+  			bar: 2,
+  			foobar: [
+  				1,
+  				2,
+  				3
+  			],
+  			callback: function(){
+  				return true;
+  			}
+  		}, options||{}));
+  	}
+
+  	$.fn[class_name]=function() {
+
+  		var _arguments=arguments;
+  		return this.each(function(){
+
+  			var options=$(this).data(class_name+'_public');
+  			if (!options) {
+  				init.apply(this,_arguments);
+
+  			} else {
+  				var method=public_method[_arguments[0]];
+
+  				if (typeof(method)!='function') {
+  					console.log(class_name+' has no method "'+_arguments[0]+'"');
+  					return false;
+  				}
+  				_arguments[0]=options;
+  				method.apply(this,_arguments);
+  			}
+  		});
+  	}
+
+  })(jQuery);
+  JSEND
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_52()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=j1,J1
+
+  let code =<< trim [CODE]
+  JSSTART
+  function init(options) {
+  $(this).data(class_name+'_public',$.extend({},{
+  foo: 'bar',
+  bar: 2,
+  foobar: [
+  1,
+  2,
+  3
+  ],
+  callback: function(){
+  return true;
+  }
+  }, options||{}));
+  }
+  JSEND
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('^JSSTART')
+  exe "normal =/^JSEND\n"
+
+  let expected =<< trim [CODE]
+  JSSTART
+  function init(options) {
+  	$(this).data(class_name+'_public',$.extend({},{
+  		foo: 'bar',
+  		bar: 2,
+  		foobar: [
+  			1,
+  			2,
+  			3
+  		],
+  		callback: function(){
+  			return true;
+  		}
+  	}, options||{}));
+  }
+  JSEND
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_53()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=j1,J1
+
+  let code =<< trim [CODE]
+  JSSTART
+  (function($){
+  function init(options) {
+  $(this).data(class_name+'_public',$.extend({},{
+  foo: 'bar',
+  bar: 2,
+  foobar: [
+  1,
+  2,
+  3
+  ],
+  callback: function(){
+  return true;
+  }
+  }, options||{}));
+  }
+  })(jQuery);
+  JSEND
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('^JSSTART')
+  exe "normal =/^JSEND\n"
+
+  let expected =<< trim [CODE]
+  JSSTART
+  (function($){
+  	function init(options) {
+  		$(this).data(class_name+'_public',$.extend({},{
+  			foo: 'bar',
+  			bar: 2,
+  			foobar: [
+  				1,
+  				2,
+  				3
+  			],
+  			callback: function(){
+  				return true;
+  			}
+  		}, options||{}));
+  	}
+  })(jQuery);
+  JSEND
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_54()
+  new
+  setl cindent ts=4 sw=4
+  setl cino=j1,J1,+2
+
+  let code =<< trim [CODE]
+  JSSTART
+  // Results of JavaScript indent
+  // 1
+  (function(){
+  var a = [
+  'a',
+  'b',
+  'c',
+  'd',
+  'e',
+  'f',
+  'g',
+  'h',
+  'i'
+  ];
+  }())
+
+  // 2
+  (function(){
+  var a = [
+  0 +
+  5 *
+  9 *
+  'a',
+  'b',
+  0 +
+  5 *
+  9 *
+  'c',
+  'd',
+  'e',
+  'f',
+  'g',
+  'h',
+  'i'
+  ];
+  }())
+
+  // 3
+  (function(){
+  var a = [
+  0 +
+  // comment 1
+  5 *
+  /* comment 2 */
+  9 *
+  'a',
+  'b',
+  0 +
+  5 *
+  9 *
+  'c',
+  'd',
+  'e',
+  'f',
+  'g',
+  'h',
+  'i'
+  ];
+  }())
+
+  // 4
+  {
+  var a = [
+  0,
+  1
+  ];
+  var b;
+  var c;
+  }
+
+  // 5
+  {
+  var a = [
+  [
+  0
+  ],
+  2,
+  3
+  ];
+  }
+
+  // 6
+  {
+  var a = [
+  [
+  0,
+  1
+  ],
+  2,
+  3
+  ];
+  }
+
+  // 7
+  {
+  var a = [
+  // [
+  0,
+  // 1
+  // ],
+  2,
+  3
+  ];
+  }
+
+  // 8
+  var x = [
+  (function(){
+  var a,
+  b,
+  c,
+  d,
+  e,
+  f,
+  g,
+  h,
+  i;
+  })
+  ];
+
+  // 9
+  var a = [
+  0 +
+  5 *
+  9 *
+  'a',
+  'b',
+  0 +
+  5 *
+  9 *
+  'c',
+  'd',
+  'e',
+  'f',
+  'g',
+  'h',
+  'i'
+  ];
+
+  // 10
+  var a,
+  b,
+  c,
+  d,
+  e,
+  f,
+  g,
+  h,
+  i;
+  JSEND
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('^JSSTART')
+  exe "normal =/^JSEND\n"
+
+  let expected =<< trim [CODE]
+  JSSTART
+  // Results of JavaScript indent
+  // 1
+  (function(){
+  	var a = [
+  	  'a',
+  	  'b',
+  	  'c',
+  	  'd',
+  	  'e',
+  	  'f',
+  	  'g',
+  	  'h',
+  	  'i'
+  	];
+  }())
+
+  // 2
+  (function(){
+  	var a = [
+  	  0 +
+  		5 *
+  		9 *
+  		'a',
+  	  'b',
+  	  0 +
+  		5 *
+  		9 *
+  		'c',
+  	  'd',
+  	  'e',
+  	  'f',
+  	  'g',
+  	  'h',
+  	  'i'
+  	];
+  }())
+
+  // 3
+  (function(){
+  	var a = [
+  	  0 +
+  		// comment 1
+  		5 *
+  		/* comment 2 */
+  		9 *
+  		'a',
+  	  'b',
+  	  0 +
+  		5 *
+  		9 *
+  		'c',
+  	  'd',
+  	  'e',
+  	  'f',
+  	  'g',
+  	  'h',
+  	  'i'
+  	];
+  }())
+
+  // 4
+  {
+  	var a = [
+  	  0,
+  	  1
+  	];
+  	var b;
+  	var c;
+  }
+
+  // 5
+  {
+  	var a = [
+  	  [
+  		0
+  	  ],
+  	  2,
+  	  3
+  	];
+  }
+
+  // 6
+  {
+  	var a = [
+  	  [
+  		0,
+  		1
+  	  ],
+  	  2,
+  	  3
+  	];
+  }
+
+  // 7
+  {
+  	var a = [
+  	  // [
+  	  0,
+  	  // 1
+  	  // ],
+  	  2,
+  	  3
+  	];
+  }
+
+  // 8
+  var x = [
+    (function(){
+  	  var a,
+  	  b,
+  	  c,
+  	  d,
+  	  e,
+  	  f,
+  	  g,
+  	  h,
+  	  i;
+    })
+  ];
+
+  // 9
+  var a = [
+    0 +
+    5 *
+    9 *
+    'a',
+    'b',
+    0 +
+    5 *
+    9 *
+    'c',
+    'd',
+    'e',
+    'f',
+    'g',
+    'h',
+    'i'
+  ];
+
+  // 10
+  var a,
+  	b,
+  	c,
+  	d,
+  	e,
+  	f,
+  	g,
+  	h,
+  	i;
+  JSEND
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_55()
+  new
+  setl cindent ts=4 sw=4
+  setl cino&
+
+  let code =<< trim [CODE]
+  /* start of define */
+  {
+  }
+  #define AAA \
+  BBB\
+  CCC
+
+  #define CNT \
+  1 + \
+  2 + \
+  4
+  /* end of define */
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('start of define')
+  exe "normal =/end of define\n"
+
+  let expected =<< trim [CODE]
+  /* start of define */
+  {
+  }
+  #define AAA \
+  	BBB\
+  	CCC
+
+  #define CNT \
+  	1 + \
+  	2 + \
+  	4
+  /* end of define */
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
+func Test_cindent_56()
+  new
+  setl cindent ts=4 sw=4
+  setl cino&
+
+  let code =<< trim [CODE]
+  {
+  	a = second/*bug*/*line;
+  }
+  [CODE]
+
+  call append(0, code)
+  normal gg
+  call search('a = second')
+  normal ox
+
+  let expected =<< trim [CODE]
+  {
+  	a = second/*bug*/*line;
+  	x
+  }
+
+  [CODE]
+
+  call assert_equal(expected, getline(1, '$'))
+  enew! | close
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1434,
+/**/
     1433,
 /**/
     1432,