13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ciimport {
173af6ab5fSopenharmony_ci  OhosLibC,
183af6ab5fSopenharmony_ci  OhosLibI,
193af6ab5fSopenharmony_ci  OhosLibIC,
203af6ab5fSopenharmony_ci  OhosLibII,
213af6ab5fSopenharmony_ci  OhosLibCC,
223af6ab5fSopenharmony_ci  OhosLibCI
233af6ab5fSopenharmony_ci} from './oh_modules/ohos_lib'
243af6ab5fSopenharmony_ci
253af6ab5fSopenharmony_ciimport {
263af6ab5fSopenharmony_ci  DynLibC,
273af6ab5fSopenharmony_ci  DynLibI,
283af6ab5fSopenharmony_ci  DynLibIC,
293af6ab5fSopenharmony_ci  DynLibII,
303af6ab5fSopenharmony_ci  DynLibCC,
313af6ab5fSopenharmony_ci  DynLibCI
323af6ab5fSopenharmony_ci} from './dynamic_lib'
333af6ab5fSopenharmony_ci
343af6ab5fSopenharmony_ciimport type { lang } from './@arkts.lang';
353af6ab5fSopenharmony_ci
363af6ab5fSopenharmony_ciclass A {
373af6ab5fSopenharmony_ci  getName(): string { return 'A'; }
383af6ab5fSopenharmony_ci  getType(): string { return 'class'; }
393af6ab5fSopenharmony_ci}
403af6ab5fSopenharmony_ciclass B {
413af6ab5fSopenharmony_ci  getName(): string { return 'B'; }
423af6ab5fSopenharmony_ci  getType(): string { return 'type'; }
433af6ab5fSopenharmony_ci}
443af6ab5fSopenharmony_cifunction foo(a1: A, ...a2: A[]): void {
453af6ab5fSopenharmony_ci}
463af6ab5fSopenharmony_cifoo(new B, new A, new B);
473af6ab5fSopenharmony_ci
483af6ab5fSopenharmony_cilet a =  new A;
493af6ab5fSopenharmony_cia = new B;
503af6ab5fSopenharmony_ci
513af6ab5fSopenharmony_cilet b: B = new A;
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_cifunction bar(bArr: B[]): void {
543af6ab5fSopenharmony_ci  bArr[0] = new A;
553af6ab5fSopenharmony_ci}
563af6ab5fSopenharmony_ci
573af6ab5fSopenharmony_cilet name = (new B as A).getName();
583af6ab5fSopenharmony_ci
593af6ab5fSopenharmony_ciclass C extends B {
603af6ab5fSopenharmony_ci  getBase(): string { return 'B'; }
613af6ab5fSopenharmony_ci}
623af6ab5fSopenharmony_ci
633af6ab5fSopenharmony_cifunction goo(): B {
643af6ab5fSopenharmony_ci  return new B;
653af6ab5fSopenharmony_ci}
663af6ab5fSopenharmony_cilet cl: C = goo() as C;
673af6ab5fSopenharmony_ci
683af6ab5fSopenharmony_cifunction zoo(b: B): void {
693af6ab5fSopenharmony_ci}
703af6ab5fSopenharmony_cizoo(cl as B);
713af6ab5fSopenharmony_ci
723af6ab5fSopenharmony_ciclass IdentLibC {}
733af6ab5fSopenharmony_ciinterface IdentLibI {}
743af6ab5fSopenharmony_ciinterface IdentLibII extends IdentLibI {}
753af6ab5fSopenharmony_ciclass IdentLibCC extends IdentLibC {}
763af6ab5fSopenharmony_ciclass IdentLibCI implements IdentLibI {}
773af6ab5fSopenharmony_ci
783af6ab5fSopenharmony_cifunction fC(a: IdentLibC) {}
793af6ab5fSopenharmony_cifunction fI(a: IdentLibI) {}
803af6ab5fSopenharmony_ci
813af6ab5fSopenharmony_cifunction fDC(a: DynLibC) {}
823af6ab5fSopenharmony_cifunction fDI(a: DynLibI) {}
833af6ab5fSopenharmony_ci
843af6ab5fSopenharmony_cifunction fOC(a: OhosLibC) {}
853af6ab5fSopenharmony_cifunction fOI(a: OhosLibI) {}
863af6ab5fSopenharmony_ci
873af6ab5fSopenharmony_ciconst c: IdentLibC = {};
883af6ab5fSopenharmony_ciconst i: IdentLibI = {};
893af6ab5fSopenharmony_ciconst ci: IdentLibCI = {};
903af6ab5fSopenharmony_ciconst cc: IdentLibCC = {};
913af6ab5fSopenharmony_ciconst ii: IdentLibII = {};
923af6ab5fSopenharmony_ci
933af6ab5fSopenharmony_ciconst dc: DynLibC = {};
943af6ab5fSopenharmony_ciconst di: DynLibI = {};
953af6ab5fSopenharmony_ciconst dci: DynLibCI = {};
963af6ab5fSopenharmony_ciconst dcc: DynLibCC = {};
973af6ab5fSopenharmony_ciconst dii: DynLibII = {};
983af6ab5fSopenharmony_ciconst dic: DynLibIC = {};
993af6ab5fSopenharmony_ci
1003af6ab5fSopenharmony_ciconst oc: OhosLibC = {};
1013af6ab5fSopenharmony_ciconst oi: OhosLibI = {};
1023af6ab5fSopenharmony_ciconst oci: OhosLibCI = {};
1033af6ab5fSopenharmony_ciconst occ: OhosLibCC = {};
1043af6ab5fSopenharmony_ciconst oii: OhosLibII = {};
1053af6ab5fSopenharmony_ciconst oic: OhosLibIC = {};
1063af6ab5fSopenharmony_ci
1073af6ab5fSopenharmony_cifC(c);    // OK
1083af6ab5fSopenharmony_cifC(i);    // ERR, no inheritance relation
1093af6ab5fSopenharmony_cifC(ci);   // ERR, no inheritance relation
1103af6ab5fSopenharmony_cifC(cc);   // OK
1113af6ab5fSopenharmony_cifC(ii);   // ERR, no inheritance relation
1123af6ab5fSopenharmony_cifI(c);    // ERR, no inheritance relation
1133af6ab5fSopenharmony_cifI(i);    // OK
1143af6ab5fSopenharmony_cifI(ci);   // OK
1153af6ab5fSopenharmony_cifI(cc);   // ERR, no inheritance relation
1163af6ab5fSopenharmony_cifI(ii);   // OK
1173af6ab5fSopenharmony_cifDC(c);   // OK, assignment to dynamic
1183af6ab5fSopenharmony_cifDC(i);   // OK, assignment to dynamic
1193af6ab5fSopenharmony_cifDC(ci);  // OK, assignment to dynamic
1203af6ab5fSopenharmony_cifDC(cc);  // OK, assignment to dynamic
1213af6ab5fSopenharmony_cifDC(ii);  // OK, assignment to dynamic
1223af6ab5fSopenharmony_cifDI(c);   // OK, assignment to dynamic
1233af6ab5fSopenharmony_cifDI(i);   // OK, assignment to dynamic
1243af6ab5fSopenharmony_cifDI(ci);  // OK, assignment to dynamic
1253af6ab5fSopenharmony_cifDI(cc);  // OK, assignment to dynamic
1263af6ab5fSopenharmony_cifDI(ii);  // OK, assignment to dynamic
1273af6ab5fSopenharmony_cifOC(c);   // OK, assignment to dynamic
1283af6ab5fSopenharmony_cifOC(i);   // OK, assignment to dynamic
1293af6ab5fSopenharmony_cifOC(ci);  // OK, assignment to dynamic
1303af6ab5fSopenharmony_cifOC(cc);  // OK, assignment to dynamic
1313af6ab5fSopenharmony_cifOC(ii);  // OK, assignment to dynamic
1323af6ab5fSopenharmony_cifOI(c);   // OK, assignment to dynamic
1333af6ab5fSopenharmony_cifOI(i);   // OK, assignment to dynamic
1343af6ab5fSopenharmony_cifOI(ci);  // OK, assignment to dynamic
1353af6ab5fSopenharmony_cifOI(cc);  // OK, assignment to dynamic
1363af6ab5fSopenharmony_cifOI(ii);  // OK, assignment to dynamic
1373af6ab5fSopenharmony_ci
1383af6ab5fSopenharmony_cifC(dc);   // ERR, no inheritance relation
1393af6ab5fSopenharmony_cifC(di);   // ERR, no inheritance relation
1403af6ab5fSopenharmony_cifC(dci);  // ERR, no inheritance relation
1413af6ab5fSopenharmony_cifC(dcc);  // ERR, no inheritance relation
1423af6ab5fSopenharmony_cifC(dii);  // ERR, no inheritance relation
1433af6ab5fSopenharmony_cifC(dic);  // ERR, no inheritance relation
1443af6ab5fSopenharmony_cifI(dc);   // ERR, no inheritance relation
1453af6ab5fSopenharmony_cifI(di);   // ERR, no inheritance relation
1463af6ab5fSopenharmony_cifI(dci);  // ERR, no inheritance relation
1473af6ab5fSopenharmony_cifI(dcc);  // ERR, no inheritance relation
1483af6ab5fSopenharmony_cifI(dii);  // ERR, no inheritance relation
1493af6ab5fSopenharmony_cifI(dic);  // ERR, no inheritance relation
1503af6ab5fSopenharmony_cifDC(dc);  // OK, assignment to dynamic
1513af6ab5fSopenharmony_cifDC(di);  // OK, assignment to dynamic
1523af6ab5fSopenharmony_cifDC(dci); // OK, assignment to dynamic
1533af6ab5fSopenharmony_cifDC(dcc); // OK, assignment to dynamic
1543af6ab5fSopenharmony_cifDC(dii); // OK, assignment to dynamic
1553af6ab5fSopenharmony_cifDC(dic); // OK, assignment to dynamic
1563af6ab5fSopenharmony_cifDI(dc);  // OK, assignment to dynamic
1573af6ab5fSopenharmony_cifDI(di);  // OK, assignment to dynamic
1583af6ab5fSopenharmony_cifDI(dci); // OK, assignment to dynamic
1593af6ab5fSopenharmony_cifDI(dcc); // OK, assignment to dynamic
1603af6ab5fSopenharmony_cifDI(dii); // OK, assignment to dynamic
1613af6ab5fSopenharmony_cifDI(dic); // OK, assignment to dynamic
1623af6ab5fSopenharmony_cifOC(dc);  // OK, assignment to dynamic
1633af6ab5fSopenharmony_cifOC(di);  // OK, assignment to dynamic
1643af6ab5fSopenharmony_cifOC(dci); // OK, assignment to dynamic
1653af6ab5fSopenharmony_cifOC(dcc); // OK, assignment to dynamic
1663af6ab5fSopenharmony_cifOC(dii); // OK, assignment to dynamic
1673af6ab5fSopenharmony_cifOC(dic); // OK, assignment to dynamic
1683af6ab5fSopenharmony_cifOI(dc);  // OK, assignment to dynamic
1693af6ab5fSopenharmony_cifOI(di);  // OK, assignment to dynamic
1703af6ab5fSopenharmony_cifOI(dci); // OK, assignment to dynamic
1713af6ab5fSopenharmony_cifOI(dcc); // OK, assignment to dynamic
1723af6ab5fSopenharmony_cifOI(dii); // OK, assignment to dynamic
1733af6ab5fSopenharmony_cifOI(dic); // OK, assignment to dynamic
1743af6ab5fSopenharmony_ci
1753af6ab5fSopenharmony_cifC(oc);   // ERR, no inheritance relation
1763af6ab5fSopenharmony_cifC(oi);   // ERR, no inheritance relation
1773af6ab5fSopenharmony_cifC(oci);  // ERR, no inheritance relation
1783af6ab5fSopenharmony_cifC(occ);  // ERR, no inheritance relation
1793af6ab5fSopenharmony_cifC(oii);  // ERR, no inheritance relation
1803af6ab5fSopenharmony_cifC(oic);  // ERR, no inheritance relation
1813af6ab5fSopenharmony_cifI(oc);   // ERR, no inheritance relation
1823af6ab5fSopenharmony_cifI(oi);   // ERR, no inheritance relation
1833af6ab5fSopenharmony_cifI(oci);  // ERR, no inheritance relation
1843af6ab5fSopenharmony_cifI(occ);  // ERR, no inheritance relation
1853af6ab5fSopenharmony_cifI(oii);  // ERR, no inheritance relation
1863af6ab5fSopenharmony_cifI(oic);  // ERR, no inheritance relation
1873af6ab5fSopenharmony_cifDC(oc);  // OK, assignment to dynamic
1883af6ab5fSopenharmony_cifDC(oi);  // OK, assignment to dynamic
1893af6ab5fSopenharmony_cifDC(oci); // OK, assignment to dynamic
1903af6ab5fSopenharmony_cifDC(occ); // OK, assignment to dynamic
1913af6ab5fSopenharmony_cifDC(oii); // OK, assignment to dynamic
1923af6ab5fSopenharmony_cifDC(oic); // OK, assignment to dynamic
1933af6ab5fSopenharmony_cifDI(oc);  // OK, assignment to dynamic
1943af6ab5fSopenharmony_cifDI(oi);  // OK, assignment to dynamic
1953af6ab5fSopenharmony_cifDI(oci); // OK, assignment to dynamic
1963af6ab5fSopenharmony_cifDI(occ); // OK, assignment to dynamic
1973af6ab5fSopenharmony_cifDI(oii); // OK, assignment to dynamic
1983af6ab5fSopenharmony_cifDI(oic); // OK, assignment to dynamic
1993af6ab5fSopenharmony_cifOC(oc);  // OK, assignment to dynamic
2003af6ab5fSopenharmony_cifOC(oi);  // OK, assignment to dynamic
2013af6ab5fSopenharmony_cifOC(oci); // OK, assignment to dynamic
2023af6ab5fSopenharmony_cifOC(occ); // OK, assignment to dynamic
2033af6ab5fSopenharmony_cifOC(oii); // OK, assignment to dynamic
2043af6ab5fSopenharmony_cifOC(oic); // OK, assignment to dynamic
2053af6ab5fSopenharmony_cifOI(oc);  // OK, assignment to dynamic
2063af6ab5fSopenharmony_cifOI(oi);  // OK, assignment to dynamic
2073af6ab5fSopenharmony_cifOI(oci); // OK, assignment to dynamic
2083af6ab5fSopenharmony_cifOI(occ); // OK, assignment to dynamic
2093af6ab5fSopenharmony_cifOI(oii); // OK, assignment to dynamic
2103af6ab5fSopenharmony_cifOI(oic); // OK, assignment to dynamic
2113af6ab5fSopenharmony_ci
2123af6ab5fSopenharmony_ci// Structural typing is now relaxed for 'as' expression, all cases are OK
2133af6ab5fSopenharmony_cic as IdentLibC;
2143af6ab5fSopenharmony_cii as IdentLibC;
2153af6ab5fSopenharmony_cici as IdentLibC;
2163af6ab5fSopenharmony_cicc as IdentLibC;
2173af6ab5fSopenharmony_ciii as IdentLibC;
2183af6ab5fSopenharmony_cic as IdentLibI;
2193af6ab5fSopenharmony_cii as IdentLibI;
2203af6ab5fSopenharmony_cici as IdentLibI;
2213af6ab5fSopenharmony_cicc as IdentLibI;
2223af6ab5fSopenharmony_ciii as IdentLibI;
2233af6ab5fSopenharmony_cic as DynLibC;
2243af6ab5fSopenharmony_cii as DynLibC;
2253af6ab5fSopenharmony_cici as DynLibC;
2263af6ab5fSopenharmony_cicc as DynLibC;
2273af6ab5fSopenharmony_ciii as DynLibC;
2283af6ab5fSopenharmony_cic as DynLibI;
2293af6ab5fSopenharmony_cii as DynLibI;
2303af6ab5fSopenharmony_cici as DynLibI;
2313af6ab5fSopenharmony_cicc as DynLibI;
2323af6ab5fSopenharmony_ciii as DynLibI;
2333af6ab5fSopenharmony_cic as OhosLibC;
2343af6ab5fSopenharmony_cii as OhosLibC;
2353af6ab5fSopenharmony_cici as OhosLibC;
2363af6ab5fSopenharmony_cicc as OhosLibC;
2373af6ab5fSopenharmony_ciii as OhosLibC;
2383af6ab5fSopenharmony_cic as OhosLibI;
2393af6ab5fSopenharmony_cii as OhosLibI;
2403af6ab5fSopenharmony_cici as OhosLibI;
2413af6ab5fSopenharmony_cicc as OhosLibI;
2423af6ab5fSopenharmony_ciii as OhosLibI;
2433af6ab5fSopenharmony_ci
2443af6ab5fSopenharmony_cidc as IdentLibC;
2453af6ab5fSopenharmony_cidi as IdentLibC;
2463af6ab5fSopenharmony_cidci as IdentLibC;
2473af6ab5fSopenharmony_cidcc as IdentLibC;
2483af6ab5fSopenharmony_cidii as IdentLibC;
2493af6ab5fSopenharmony_cidic as IdentLibC;
2503af6ab5fSopenharmony_cidc as IdentLibI;
2513af6ab5fSopenharmony_cidi as IdentLibI;
2523af6ab5fSopenharmony_cidci as IdentLibI;
2533af6ab5fSopenharmony_cidcc as IdentLibI;
2543af6ab5fSopenharmony_cidii as IdentLibI;
2553af6ab5fSopenharmony_cidic as IdentLibI;
2563af6ab5fSopenharmony_cidc as DynLibC;
2573af6ab5fSopenharmony_cidi as DynLibC;
2583af6ab5fSopenharmony_cidci as DynLibC;
2593af6ab5fSopenharmony_cidcc as DynLibC;
2603af6ab5fSopenharmony_cidii as DynLibC;
2613af6ab5fSopenharmony_cidic as DynLibC;
2623af6ab5fSopenharmony_cidc as DynLibI;
2633af6ab5fSopenharmony_cidi as DynLibI;
2643af6ab5fSopenharmony_cidci as DynLibI;
2653af6ab5fSopenharmony_cidcc as DynLibI;
2663af6ab5fSopenharmony_cidii as DynLibI;
2673af6ab5fSopenharmony_cidic as DynLibI;
2683af6ab5fSopenharmony_cidc as OhosLibC;
2693af6ab5fSopenharmony_cidi as OhosLibC;
2703af6ab5fSopenharmony_cidci as OhosLibC;
2713af6ab5fSopenharmony_cidcc as OhosLibC;
2723af6ab5fSopenharmony_cidii as OhosLibC;
2733af6ab5fSopenharmony_cidic as OhosLibC;
2743af6ab5fSopenharmony_cidc as OhosLibI;
2753af6ab5fSopenharmony_cidi as OhosLibI;
2763af6ab5fSopenharmony_cidci as OhosLibI;
2773af6ab5fSopenharmony_cidcc as OhosLibI;
2783af6ab5fSopenharmony_cidii as OhosLibI;
2793af6ab5fSopenharmony_cidic as OhosLibI;
2803af6ab5fSopenharmony_ci
2813af6ab5fSopenharmony_cioc as IdentLibC;
2823af6ab5fSopenharmony_cioi as IdentLibC;
2833af6ab5fSopenharmony_cioci as IdentLibC;
2843af6ab5fSopenharmony_ciocc as IdentLibC;
2853af6ab5fSopenharmony_cioii as IdentLibC;
2863af6ab5fSopenharmony_cioic as IdentLibC;
2873af6ab5fSopenharmony_cioc as IdentLibI;
2883af6ab5fSopenharmony_cioi as IdentLibI;
2893af6ab5fSopenharmony_cioci as IdentLibI;
2903af6ab5fSopenharmony_ciocc as IdentLibI;
2913af6ab5fSopenharmony_cioii as IdentLibI;
2923af6ab5fSopenharmony_cioic as IdentLibI;
2933af6ab5fSopenharmony_cioc as DynLibC;
2943af6ab5fSopenharmony_cioi as DynLibC;
2953af6ab5fSopenharmony_cioci as DynLibC;
2963af6ab5fSopenharmony_ciocc as DynLibC;
2973af6ab5fSopenharmony_cioii as DynLibC;
2983af6ab5fSopenharmony_cioic as DynLibC;
2993af6ab5fSopenharmony_cioc as DynLibI;
3003af6ab5fSopenharmony_cioi as DynLibI;
3013af6ab5fSopenharmony_cioci as DynLibI;
3023af6ab5fSopenharmony_ciocc as DynLibI;
3033af6ab5fSopenharmony_cioii as DynLibI;
3043af6ab5fSopenharmony_cioic as DynLibI;
3053af6ab5fSopenharmony_cioc as OhosLibC;
3063af6ab5fSopenharmony_cioi as OhosLibC;
3073af6ab5fSopenharmony_cioci as OhosLibC;
3083af6ab5fSopenharmony_ciocc as OhosLibC;
3093af6ab5fSopenharmony_cioii as OhosLibC;
3103af6ab5fSopenharmony_cioic as OhosLibC;
3113af6ab5fSopenharmony_cioc as OhosLibI;
3123af6ab5fSopenharmony_cioi as OhosLibI;
3133af6ab5fSopenharmony_cioci as OhosLibI;
3143af6ab5fSopenharmony_ciocc as OhosLibI;
3153af6ab5fSopenharmony_cioii as OhosLibI;
3163af6ab5fSopenharmony_cioic as OhosLibI;
3173af6ab5fSopenharmony_ci
3183af6ab5fSopenharmony_ciclass Ct {
3193af6ab5fSopenharmony_ci  a: number = 1
3203af6ab5fSopenharmony_ci  b: string = ""
3213af6ab5fSopenharmony_ci}
3223af6ab5fSopenharmony_ci
3233af6ab5fSopenharmony_ciinterface I {
3243af6ab5fSopenharmony_ci  a: number
3253af6ab5fSopenharmony_ci}
3263af6ab5fSopenharmony_ci
3273af6ab5fSopenharmony_ciclass Cz {
3283af6ab5fSopenharmony_ci  x: Ct | null = new Ct();
3293af6ab5fSopenharmony_ci  y: I = this.x as I
3303af6ab5fSopenharmony_ci}
3313af6ab5fSopenharmony_ci
3323af6ab5fSopenharmony_cilet x: Ct | null = new Ct();
3333af6ab5fSopenharmony_cilet y: I = x as I
3343af6ab5fSopenharmony_ci
3353af6ab5fSopenharmony_ciclass X {}
3363af6ab5fSopenharmony_ciclass Y {}
3373af6ab5fSopenharmony_ciclass Z {}
3383af6ab5fSopenharmony_ciclass W extends X {}
3393af6ab5fSopenharmony_ci
3403af6ab5fSopenharmony_cifunction union(x: X, xy: X | Y, xz: X | Z, xyz: X | Y | Z, w: W, xw: X | W, zw: Z | W) {
3413af6ab5fSopenharmony_ci  x = xy; // ERR, 'X | Y' assigned to 'X'
3423af6ab5fSopenharmony_ci  xy = x; // OK
3433af6ab5fSopenharmony_ci
3443af6ab5fSopenharmony_ci  xy = xz; // ERR, 'X | Z' assigned to 'X | Y'
3453af6ab5fSopenharmony_ci  xz = xy; // ERR, 'X | Y' assigned to 'X | Z'
3463af6ab5fSopenharmony_ci
3473af6ab5fSopenharmony_ci  xyz = xz; // OK
3483af6ab5fSopenharmony_ci  xz = xyz; // ERR, 'X | Y | Z' assigned to 'X | Z'
3493af6ab5fSopenharmony_ci  
3503af6ab5fSopenharmony_ci  x = w; // OK
3513af6ab5fSopenharmony_ci  w = x; // ERR, 'X' assigned to 'W' 
3523af6ab5fSopenharmony_ci
3533af6ab5fSopenharmony_ci  x = xw; // OK
3543af6ab5fSopenharmony_ci  xw = x; // OK
3553af6ab5fSopenharmony_ci
3563af6ab5fSopenharmony_ci  xw = zw; // ERR, 'Z | W' assigned to 'X | W'
3573af6ab5fSopenharmony_ci  zw = xw; // ERR, 'X | W' assigned to 'Z | W'
3583af6ab5fSopenharmony_ci  
3593af6ab5fSopenharmony_ci  xz = zw; // OK
3603af6ab5fSopenharmony_ci  zw = xz; // ERR, 'X | Z' assigned to 'Z | W'
3613af6ab5fSopenharmony_ci}
3623af6ab5fSopenharmony_ci
3633af6ab5fSopenharmony_ciclass C0 {}
3643af6ab5fSopenharmony_ciclass C1 {}
3653af6ab5fSopenharmony_ciclass C2<T> {}
3663af6ab5fSopenharmony_ci
3673af6ab5fSopenharmony_citype U1 = number | string | boolean;
3683af6ab5fSopenharmony_citype U2 = number[] | string[] | boolean[];
3693af6ab5fSopenharmony_citype U3 = C1 | C2<number> | C2<string>;
3703af6ab5fSopenharmony_citype U4 = C1[] | C2<number>[] | C2<string>[];
3713af6ab5fSopenharmony_ci
3723af6ab5fSopenharmony_cifunction testUnionStructuralIdentityNegative(u1: U1, u2: U2, u3: U3, u4: U4) {
3733af6ab5fSopenharmony_ci  // no CTE expected
3743af6ab5fSopenharmony_ci  u1 as number;
3753af6ab5fSopenharmony_ci  u1 as string;
3763af6ab5fSopenharmony_ci  u1 as boolean;
3773af6ab5fSopenharmony_ci
3783af6ab5fSopenharmony_ci  u1 as number | string;
3793af6ab5fSopenharmony_ci  u1 as number | boolean;
3803af6ab5fSopenharmony_ci  u1 as string | boolean;
3813af6ab5fSopenharmony_ci
3823af6ab5fSopenharmony_ci  u1 as number | string | boolean;
3833af6ab5fSopenharmony_ci  u1 as boolean | number | string;
3843af6ab5fSopenharmony_ci  u1 as U1;
3853af6ab5fSopenharmony_ci
3863af6ab5fSopenharmony_ci  // no CTE expected
3873af6ab5fSopenharmony_ci  u2 as number[];
3883af6ab5fSopenharmony_ci  u2 as string[];
3893af6ab5fSopenharmony_ci  u2 as boolean[];
3903af6ab5fSopenharmony_ci
3913af6ab5fSopenharmony_ci  u2 as number[] | string[];
3923af6ab5fSopenharmony_ci  u2 as number[] | boolean[];
3933af6ab5fSopenharmony_ci  u2 as string[] | boolean[];
3943af6ab5fSopenharmony_ci
3953af6ab5fSopenharmony_ci  u2 as number[] | string[] | boolean[];
3963af6ab5fSopenharmony_ci  u2 as boolean[] | number[] | string[];
3973af6ab5fSopenharmony_ci  u2 as U2;
3983af6ab5fSopenharmony_ci
3993af6ab5fSopenharmony_ci  // no CTE expected
4003af6ab5fSopenharmony_ci  u3 as C1;
4013af6ab5fSopenharmony_ci  u3 as C2<number>;
4023af6ab5fSopenharmony_ci  u3 as C2<string>;
4033af6ab5fSopenharmony_ci
4043af6ab5fSopenharmony_ci  u3 as C1 | C2<number>;
4053af6ab5fSopenharmony_ci  u3 as C1 | C2<string>;
4063af6ab5fSopenharmony_ci  u3 as C2<number> | C2<string>;
4073af6ab5fSopenharmony_ci
4083af6ab5fSopenharmony_ci  u3 as C1 | C2<number> | C2<string>;
4093af6ab5fSopenharmony_ci  u3 as C2<string> | C2<number> | C1;
4103af6ab5fSopenharmony_ci  u3 as U3;
4113af6ab5fSopenharmony_ci
4123af6ab5fSopenharmony_ci  // no CTE expected
4133af6ab5fSopenharmony_ci  u4 as C1[];
4143af6ab5fSopenharmony_ci  u4 as C2<number>[];
4153af6ab5fSopenharmony_ci  u4 as C2<string>[];
4163af6ab5fSopenharmony_ci
4173af6ab5fSopenharmony_ci  u4 as C1[] | C2<number>[];
4183af6ab5fSopenharmony_ci  u4 as C1[] | C2<string>[];
4193af6ab5fSopenharmony_ci  u4 as C2<number>[] | C2<string>[];
4203af6ab5fSopenharmony_ci
4213af6ab5fSopenharmony_ci  u4 as C1[] | C2<number>[] | C2<string>[];
4223af6ab5fSopenharmony_ci  u4 as C2<string>[] | C2<number>[] | C1[];
4233af6ab5fSopenharmony_ci  u4 as U4;
4243af6ab5fSopenharmony_ci}
4253af6ab5fSopenharmony_ci
4263af6ab5fSopenharmony_cifunction testUnionStructuralIdentityPositive(u1: U1, u2: U2, u3: U3, u4: U4) {
4273af6ab5fSopenharmony_ci  u1 as Number;
4283af6ab5fSopenharmony_ci  u1 as String;
4293af6ab5fSopenharmony_ci  u1 as Boolean;
4303af6ab5fSopenharmony_ci
4313af6ab5fSopenharmony_ci  u1 as Number | String;
4323af6ab5fSopenharmony_ci  u1 as Number | Boolean;
4333af6ab5fSopenharmony_ci  u1 as String | Boolean;
4343af6ab5fSopenharmony_ci
4353af6ab5fSopenharmony_ci  u1 as Number | String | Boolean;
4363af6ab5fSopenharmony_ci  u1 as Boolean | Number | String;
4373af6ab5fSopenharmony_ci  u1 as U1 | U2;
4383af6ab5fSopenharmony_ci
4393af6ab5fSopenharmony_ci  u2 as Number[];
4403af6ab5fSopenharmony_ci  u2 as String[];
4413af6ab5fSopenharmony_ci  u2 as Boolean[];
4423af6ab5fSopenharmony_ci
4433af6ab5fSopenharmony_ci  u2 as Number[] | String[];
4443af6ab5fSopenharmony_ci  u2 as Number[] | Boolean[];
4453af6ab5fSopenharmony_ci  u2 as String[] | Boolean[];
4463af6ab5fSopenharmony_ci
4473af6ab5fSopenharmony_ci  u2 as Number[] | String[] | Boolean[];
4483af6ab5fSopenharmony_ci  u2 as Boolean[] | Number[] | String[];
4493af6ab5fSopenharmony_ci  u2 as U2 | U1;
4503af6ab5fSopenharmony_ci
4513af6ab5fSopenharmony_ci  u3 as C1 | C0;
4523af6ab5fSopenharmony_ci  u3 as C2<boolean>;
4533af6ab5fSopenharmony_ci  u3 as C2<C1>;
4543af6ab5fSopenharmony_ci
4553af6ab5fSopenharmony_ci  u3 as C1 | C2<number> | C2<string> | C0;
4563af6ab5fSopenharmony_ci  u3 as C1 | C2<string> | number;
4573af6ab5fSopenharmony_ci  u3 as C2<number> | C2<string> | C2<boolean>;
4583af6ab5fSopenharmony_ci
4593af6ab5fSopenharmony_ci  u3 as C1 | C2<number> | C2<boolean>;
4603af6ab5fSopenharmony_ci  u3 as C2<string> | C2<number> | C0;
4613af6ab5fSopenharmony_ci  u3 as U3 | U4;
4623af6ab5fSopenharmony_ci
4633af6ab5fSopenharmony_ci  u3 as C1[] | C0[];
4643af6ab5fSopenharmony_ci  u3 as C2<boolean>[];
4653af6ab5fSopenharmony_ci  u3 as C2<C1>[];
4663af6ab5fSopenharmony_ci
4673af6ab5fSopenharmony_ci  u3 as C1[] | C2<number>[] | C2<string>[] | C0[];
4683af6ab5fSopenharmony_ci  u3 as C1[] | C2<string>[] | undefined[];
4693af6ab5fSopenharmony_ci  u3 as C2<number>[] | C2<string>[] | C2<boolean>[];
4703af6ab5fSopenharmony_ci
4713af6ab5fSopenharmony_ci  u3 as C1[] | C2<number>[] | C2<string>[];
4723af6ab5fSopenharmony_ci  u3 as C2<string>[] | C2<number>[] | C0[];
4733af6ab5fSopenharmony_ci  u3 as U3 | U4;
4743af6ab5fSopenharmony_ci}
4753af6ab5fSopenharmony_ci
4763af6ab5fSopenharmony_ci
4773af6ab5fSopenharmony_ci/**
4783af6ab5fSopenharmony_ci * Add the Sendable exception to the [arks-no-struct_typing] rule.
4793af6ab5fSopenharmony_ci */
4803af6ab5fSopenharmony_ci@Sendable
4813af6ab5fSopenharmony_ciclass TC1 implements lang.ISendable {
4823af6ab5fSopenharmony_ci  name:string = 'tc1';
4833af6ab5fSopenharmony_ci}
4843af6ab5fSopenharmony_ci
4853af6ab5fSopenharmony_ci@Sendable
4863af6ab5fSopenharmony_ciclass TC2 {
4873af6ab5fSopenharmony_ci  name:string = 'tc2';
4883af6ab5fSopenharmony_ci}
4893af6ab5fSopenharmony_ci
4903af6ab5fSopenharmony_ciclass TC3 {
4913af6ab5fSopenharmony_ci  name:string = 'tc3';
4923af6ab5fSopenharmony_ci}
4933af6ab5fSopenharmony_ciconst t1 = new TC1();
4943af6ab5fSopenharmony_ciconst t2 = new TC2();
4953af6ab5fSopenharmony_ciconst t3 = new TC3();
4963af6ab5fSopenharmony_ci
4973af6ab5fSopenharmony_ci
4983af6ab5fSopenharmony_ci// Appears on SyntaxKind.VariableDeclaration node
4993af6ab5fSopenharmony_ciconst a1: lang.ISendable = t1; // OK
5003af6ab5fSopenharmony_ciconst a2: lang.ISendable = t2; // OK , Sendable can be thought of as implement ISendable
5013af6ab5fSopenharmony_ciconst a3: lang.ISendable = t2 as lang.ISendable; // OK 
5023af6ab5fSopenharmony_ciconst a4: lang.ISendable = t3; // ERROR
5033af6ab5fSopenharmony_ciconst a5: lang.ISendable = t3 as lang.ISendable; // ERROR
5043af6ab5fSopenharmony_ci
5053af6ab5fSopenharmony_ci
5063af6ab5fSopenharmony_ci// Appears on SyntaxKind.BinaryExpression node
5073af6ab5fSopenharmony_cilet b1:lang.ISendable;
5083af6ab5fSopenharmony_cib1 = t1; // OK
5093af6ab5fSopenharmony_cib1 = t2; // OK , Sendable can be thought of as implement ISendable
5103af6ab5fSopenharmony_cib1 = t2 as lang.ISendable; // OK
5113af6ab5fSopenharmony_cib1 = t3; // ERROR
5123af6ab5fSopenharmony_cib1 = t3 as lang.ISendable; // ERROR
5133af6ab5fSopenharmony_ci
5143af6ab5fSopenharmony_ci
5153af6ab5fSopenharmony_ci// Appears on SyntaxKind.CallExpression node
5163af6ab5fSopenharmony_cifunction cf(value: lang.ISendable):void {}
5173af6ab5fSopenharmony_cicf(t1); // OK
5183af6ab5fSopenharmony_cicf(t2); // OK , Sendable can be thought of as implement ISendable
5193af6ab5fSopenharmony_cicf(t2 as lang.ISendable); // OK
5203af6ab5fSopenharmony_cicf(t3); // ERROR
5213af6ab5fSopenharmony_cicf(t3 as lang.ISendable); // ERROR
5223af6ab5fSopenharmony_ci
5233af6ab5fSopenharmony_cifunction cfT<T>(value: T):void {}
5243af6ab5fSopenharmony_cicfT<lang.ISendable>(t1); // OK
5253af6ab5fSopenharmony_cicfT<lang.ISendable>(t2); // OK , Sendable can be thought of as implement ISendable
5263af6ab5fSopenharmony_cicfT<lang.ISendable>(t2 as lang.ISendable); // OK
5273af6ab5fSopenharmony_cicfT<lang.ISendable>(t3); // ERROR
5283af6ab5fSopenharmony_cicfT<lang.ISendable>(t3 as lang.ISendable); // ERROR
5293af6ab5fSopenharmony_ci
5303af6ab5fSopenharmony_ci
5313af6ab5fSopenharmony_ci// Appears on SyntaxKind.handleNewExpression node
5323af6ab5fSopenharmony_ciclass DC1 {
5333af6ab5fSopenharmony_ci  name:string;
5343af6ab5fSopenharmony_ci
5353af6ab5fSopenharmony_ci  constructor(value:lang.ISendable) {
5363af6ab5fSopenharmony_ci    this.name = value.name;
5373af6ab5fSopenharmony_ci  }
5383af6ab5fSopenharmony_ci}
5393af6ab5fSopenharmony_cinew DC1(t1); // OK
5403af6ab5fSopenharmony_cinew DC1(t2); // OK , Sendable can be thought of as implement ISendable
5413af6ab5fSopenharmony_cinew DC1(t2 as lang.ISendable); // OK
5423af6ab5fSopenharmony_cinew DC1(t3); // ERROR
5433af6ab5fSopenharmony_cinew DC1(t3 as lang.ISendable); // ERROR
5443af6ab5fSopenharmony_ci
5453af6ab5fSopenharmony_ci
5463af6ab5fSopenharmony_ci// Appears on SyntaxKind.ObjectLiteralExpression/SyntaxKind.ArrayLiteralExpression node
5473af6ab5fSopenharmony_ciinterface EI1 {
5483af6ab5fSopenharmony_ci  sendable: lang.ISendable;
5493af6ab5fSopenharmony_ci}
5503af6ab5fSopenharmony_ciconst e1: EI1 = { sendable:t1 }; // OK
5513af6ab5fSopenharmony_ciconst e2: EI1 = { sendable:t2 }; // OK , Sendable can be thought of as implement ISendable, avoid [arkts-no-untyped-obj-literals] rule
5523af6ab5fSopenharmony_ciconst e3: EI1 = { sendable:t2 as lang.ISendable }; // OK
5533af6ab5fSopenharmony_ciconst e4: EI1 = { sendable:t3 }; // ERROR
5543af6ab5fSopenharmony_ciconst e5: EI1 = { sendable:t3 as lang.ISendable }; // ERROR
5553af6ab5fSopenharmony_ciconst e1s: EI1[] = [{ sendable:t1 }]; // OK
5563af6ab5fSopenharmony_ciconst e2s: EI1[] = [{ sendable:t2 }]; // OK , Sendable can be thought of as implement ISendable.  avoid [arkts-no-untyped-obj-literals] rule
5573af6ab5fSopenharmony_ciconst e3s: EI1[] = [{ sendable:t2 as lang.ISendable }]; // OK
5583af6ab5fSopenharmony_ciconst e4s: EI1[] = [{ sendable:t3 }]; // ERROR
5593af6ab5fSopenharmony_ciconst e5s: EI1[] = [{ sendable:t3 as lang.ISendable }]; // ERROR
5603af6ab5fSopenharmony_ci
5613af6ab5fSopenharmony_ci// // Appears on SyntaxKind.PropertyDeclaration node
5623af6ab5fSopenharmony_ci// PropertyDeclaration does not do [arkts-no-structural-typing] check
5633af6ab5fSopenharmony_ci// export class FC1 {
5643af6ab5fSopenharmony_ci//   prop1: lang.ISendable = t1; // OK
5653af6ab5fSopenharmony_ci//   prop2: lang.ISendable = t2; // OK
5663af6ab5fSopenharmony_ci//   prop3: lang.ISendable = t3; // OK
5673af6ab5fSopenharmony_ci// }
5683af6ab5fSopenharmony_ci
5693af6ab5fSopenharmony_ci
5703af6ab5fSopenharmony_ci// union
5713af6ab5fSopenharmony_ciclass GC1 { }
5723af6ab5fSopenharmony_cifunction ff1(value: lang.ISendable):void {}
5733af6ab5fSopenharmony_cifunction ff2(value: lang.ISendable | GC1):void {}
5743af6ab5fSopenharmony_cifunction ff3(value: TC1 | TC2): void { ff1(value); } // OK , Sendable can be thought of as implement ISendable
5753af6ab5fSopenharmony_cifunction ff4(value: TC1 | TC3): void { ff1(value); } // ERROR
5763af6ab5fSopenharmony_cifunction ff5(value: TC1): void { ff2(value); } // OK
5773af6ab5fSopenharmony_cifunction ff6(value: TC2): void { ff2(value); } // OK , Sendable can be thought of as implement ISendable
5783af6ab5fSopenharmony_cifunction ff7(value: TC3): void { ff2(value); } // ERROR
5793af6ab5fSopenharmony_cifunction ff8(value: TC1 | TC2): void { ff2(value); } // OK , Sendable can be thought of as implement ISendable
5803af6ab5fSopenharmony_cifunction ff9(value: TC1 | TC3): void { ff2(value); } // ERROR
5813af6ab5fSopenharmony_ci
582