...
Run Format

Text file src/go/types/testdata/gotos.src

Documentation: go/types/testdata

     1	// Copyright 2011 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	// This file is a modified copy of $GOROOT/test/goto.go.
     6	
     7	package gotos
     8	
     9	var (
    10		i, n int
    11		x    []int
    12		c    chan int
    13		m    map[int]int
    14		s    string
    15	)
    16	
    17	// goto after declaration okay
    18	func _() {
    19		x := 1
    20		goto L
    21	L:
    22		_ = x
    23	}
    24	
    25	// goto before declaration okay
    26	func _() {
    27		goto L
    28	L:
    29		x := 1
    30		_ = x
    31	}
    32	
    33	// goto across declaration not okay
    34	func _() {
    35		goto L /* ERROR "goto L jumps over variable declaration at line 36" */
    36		x := 1
    37		_ = x
    38	L:
    39	}
    40	
    41	// goto across declaration in inner scope okay
    42	func _() {
    43		goto L
    44		{
    45			x := 1
    46			_ = x
    47		}
    48	L:
    49	}
    50	
    51	// goto across declaration after inner scope not okay
    52	func _() {
    53		goto L /* ERROR "goto L jumps over variable declaration at line 58" */
    54		{
    55			x := 1
    56			_ = x
    57		}
    58		x := 1
    59		_ = x
    60	L:
    61	}
    62	
    63	// goto across declaration in reverse okay
    64	func _() {
    65	L:
    66		x := 1
    67		_ = x
    68		goto L
    69	}
    70	
    71	func _() {
    72	L: L1:
    73		x := 1
    74		_ = x
    75		goto L
    76		goto L1
    77	}
    78	
    79	// error shows first offending variable
    80	func _() {
    81		goto L /* ERROR "goto L jumps over variable declaration at line 84" */
    82		x := 1
    83		_ = x
    84		y := 1
    85		_ = y
    86	L:
    87	}
    88	
    89	// goto not okay even if code path is dead
    90	func _() {
    91		goto L /* ERROR "goto L jumps over variable declaration" */
    92		x := 1
    93		_ = x
    94		y := 1
    95		_ = y
    96		return
    97	L:
    98	}
    99	
   100	// goto into outer block okay
   101	func _() {
   102		{
   103			goto L
   104		}
   105	L:
   106	}
   107	
   108	func _() {
   109		{
   110			goto L
   111			goto L1
   112		}
   113	L: L1:
   114	}
   115	
   116	// goto backward into outer block okay
   117	func _() {
   118	L:
   119		{
   120			goto L
   121		}
   122	}
   123	
   124	func _() {
   125	L: L1:
   126		{
   127			goto L
   128			goto L1
   129		}
   130	}
   131	
   132	// goto into inner block not okay
   133	func _() {
   134		goto L /* ERROR "goto L jumps into block" */
   135		{
   136		L:
   137		}
   138	}
   139	
   140	func _() {
   141		goto L /* ERROR "goto L jumps into block" */
   142		goto L1 /* ERROR "goto L1 jumps into block" */
   143		{
   144		L: L1:
   145		}
   146	}
   147	
   148	// goto backward into inner block still not okay
   149	func _() {
   150		{
   151		L:
   152		}
   153		goto L /* ERROR "goto L jumps into block" */
   154	}
   155	
   156	func _() {
   157		{
   158		L: L1:
   159		}
   160		goto L /* ERROR "goto L jumps into block" */
   161		goto L1 /* ERROR "goto L1 jumps into block" */
   162	}
   163	
   164	// error shows first (outermost) offending block
   165	func _() {
   166		goto L /* ERROR "goto L jumps into block" */
   167		{
   168			{
   169				{
   170				L:
   171				}
   172			}
   173		}
   174	}
   175	
   176	// error prefers block diagnostic over declaration diagnostic
   177	func _() {
   178		goto L /* ERROR "goto L jumps into block" */
   179		x := 1
   180		_ = x
   181		{
   182		L:
   183		}
   184	}
   185	
   186	// many kinds of blocks, all invalid to jump into or among,
   187	// but valid to jump out of
   188	
   189	// if
   190	
   191	func _() {
   192	L:
   193		if true {
   194			goto L
   195		}
   196	}
   197	
   198	func _() {
   199	L:
   200		if true {
   201			goto L
   202		} else {
   203		}
   204	}
   205	
   206	func _() {
   207	L:
   208		if false {
   209		} else {
   210			goto L
   211		}
   212	}
   213	
   214	func _() {
   215		goto L /* ERROR "goto L jumps into block" */
   216		if true {
   217		L:
   218		}
   219	}
   220	
   221	func _() {
   222		goto L /* ERROR "goto L jumps into block" */
   223		if true {
   224		L:
   225		} else {
   226		}
   227	}
   228	
   229	func _() {
   230		goto L /* ERROR "goto L jumps into block" */
   231		if true {
   232		} else {
   233		L:
   234		}
   235	}
   236	
   237	func _() {
   238		if false {
   239		L:
   240		} else {
   241			goto L /* ERROR "goto L jumps into block" */
   242		}
   243	}
   244	
   245	func _() {
   246		if true {
   247			goto L /* ERROR "goto L jumps into block" */
   248		} else {
   249		L:
   250		}
   251	}
   252	
   253	func _() {
   254		if true {
   255			goto L /* ERROR "goto L jumps into block" */
   256		} else if false {
   257		L:
   258		}
   259	}
   260	
   261	func _() {
   262		if true {
   263			goto L /* ERROR "goto L jumps into block" */
   264		} else if false {
   265		L:
   266		} else {
   267		}
   268	}
   269	
   270	func _() {
   271		if true {
   272			goto L /* ERROR "goto L jumps into block" */
   273		} else if false {
   274		} else {
   275		L:
   276		}
   277	}
   278	
   279	func _() {
   280		if true {
   281			goto L /* ERROR "goto L jumps into block" */
   282		} else {
   283			L:
   284		}
   285	}
   286	
   287	func _() {
   288		if true {
   289			L:
   290		} else {
   291			goto L /* ERROR "goto L jumps into block" */
   292		}
   293	}
   294	
   295	// for
   296	
   297	func _() {
   298		for {
   299			goto L
   300		}
   301	L:
   302	}
   303	
   304	func _() {
   305		for {
   306			goto L
   307		L:
   308		}
   309	}
   310	
   311	func _() {
   312		for {
   313		L:
   314		}
   315		goto L /* ERROR "goto L jumps into block" */
   316	}
   317	
   318	func _() {
   319		for {
   320			goto L
   321		L1:
   322		}
   323	L:
   324		goto L1 /* ERROR "goto L1 jumps into block" */
   325	}
   326	
   327	func _() {
   328		for i < n {
   329		L:
   330		}
   331		goto L /* ERROR "goto L jumps into block" */
   332	}
   333	
   334	func _() {
   335		for i = 0; i < n; i++ {
   336		L:
   337		}
   338		goto L /* ERROR "goto L jumps into block" */
   339	}
   340	
   341	func _() {
   342		for i = range x {
   343		L:
   344		}
   345		goto L /* ERROR "goto L jumps into block" */
   346	}
   347	
   348	func _() {
   349		for i = range c {
   350		L:
   351		}
   352		goto L /* ERROR "goto L jumps into block" */
   353	}
   354	
   355	func _() {
   356		for i = range m {
   357		L:
   358		}
   359		goto L /* ERROR "goto L jumps into block" */
   360	}
   361	
   362	func _() {
   363		for i = range s {
   364		L:
   365		}
   366		goto L /* ERROR "goto L jumps into block" */
   367	}
   368	
   369	// switch
   370	
   371	func _() {
   372	L:
   373		switch i {
   374		case 0:
   375			goto L
   376		}
   377	}
   378	
   379	func _() {
   380	L:
   381		switch i {
   382		case 0:
   383	
   384		default:
   385			goto L
   386		}
   387	}
   388	
   389	func _() {
   390		switch i {
   391		case 0:
   392	
   393		default:
   394		L:
   395			goto L
   396		}
   397	}
   398	
   399	func _() {
   400		switch i {
   401		case 0:
   402	
   403		default:
   404			goto L
   405		L:
   406		}
   407	}
   408	
   409	func _() {
   410		switch i {
   411		case 0:
   412			goto L
   413		L:
   414			;
   415		default:
   416		}
   417	}
   418	
   419	func _() {
   420		goto L /* ERROR "goto L jumps into block" */
   421		switch i {
   422		case 0:
   423		L:
   424		}
   425	}
   426	
   427	func _() {
   428		goto L /* ERROR "goto L jumps into block" */
   429		switch i {
   430		case 0:
   431		L:
   432			;
   433		default:
   434		}
   435	}
   436	
   437	func _() {
   438		goto L /* ERROR "goto L jumps into block" */
   439		switch i {
   440		case 0:
   441		default:
   442		L:
   443		}
   444	}
   445	
   446	func _() {
   447		switch i {
   448		default:
   449			goto L /* ERROR "goto L jumps into block" */
   450		case 0:
   451		L:
   452		}
   453	}
   454	
   455	func _() {
   456		switch i {
   457		case 0:
   458		L:
   459			;
   460		default:
   461			goto L /* ERROR "goto L jumps into block" */
   462		}
   463	}
   464	
   465	// select
   466	// different from switch.  the statement has no implicit block around it.
   467	
   468	func _() {
   469	L:
   470		select {
   471		case <-c:
   472			goto L
   473		}
   474	}
   475	
   476	func _() {
   477	L:
   478		select {
   479		case c <- 1:
   480	
   481		default:
   482			goto L
   483		}
   484	}
   485	
   486	func _() {
   487		select {
   488		case <-c:
   489	
   490		default:
   491		L:
   492			goto L
   493		}
   494	}
   495	
   496	func _() {
   497		select {
   498		case c <- 1:
   499	
   500		default:
   501			goto L
   502		L:
   503		}
   504	}
   505	
   506	func _() {
   507		select {
   508		case <-c:
   509			goto L
   510		L:
   511			;
   512		default:
   513		}
   514	}
   515	
   516	func _() {
   517		goto L /* ERROR "goto L jumps into block" */
   518		select {
   519		case c <- 1:
   520		L:
   521		}
   522	}
   523	
   524	func _() {
   525		goto L /* ERROR "goto L jumps into block" */
   526		select {
   527		case c <- 1:
   528		L:
   529			;
   530		default:
   531		}
   532	}
   533	
   534	func _() {
   535		goto L /* ERROR "goto L jumps into block" */
   536		select {
   537		case <-c:
   538		default:
   539		L:
   540		}
   541	}
   542	
   543	func _() {
   544		select {
   545		default:
   546			goto L /* ERROR "goto L jumps into block" */
   547		case <-c:
   548		L:
   549		}
   550	}
   551	
   552	func _() {
   553		select {
   554		case <-c:
   555		L:
   556			;
   557		default:
   558			goto L /* ERROR "goto L jumps into block" */
   559		}
   560	}

View as plain text