1/*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16function foo(x: int): string
17{
18  let rc: string|undefined = "default";
19
20  label1: switch(x) {
21    case 0: 
22       rc = "case 0";
23    case 1: {
24       let rc1: string|undefined = ():string => {return "case 1";}();
25       label2: switch(rc) {
26          case "default":
27             rc = undefined;
28             break label2;
29          default:
30             break label1;
31       }
32       rc = rc1;
33       break;
34    }
35    case 2: 
36       rc = undefined; 
37       let rc2: string|null = ():string => {return "case 2";}();
38       return rc2; 
39    case 3: 
40       rc = "case 3";
41       break; 
42    case 4:
43       rc = undefined;
44    default:
45       return rc != null ? rc :"case 4"
46    case 5:
47       rc = "case 5";
48  }
49
50  return rc;
51}
52
53
54function main(): void {
55  assert(foo(0) == "case 0");
56  assert(foo(1) == "case 1");
57  assert(foo(2) == "case 2");
58  assert(foo(3) == "case 3");
59  assert(foo(4) == "case 4");
60  assert(foo(5) == "case 5");
61  assert(foo(7) == "default");
62}
63