13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 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_ciclass C<T> {
173af6ab5fSopenharmony_ci    constructor (p: T) { this.v = p; }
183af6ab5fSopenharmony_ci    v : T;
193af6ab5fSopenharmony_ci}
203af6ab5fSopenharmony_ci
213af6ab5fSopenharmony_ciclass D<T1, T2> {
223af6ab5fSopenharmony_ci    constructor (p: T1, q: T2) { this.v = p; this.w = q; }
233af6ab5fSopenharmony_ci    v : T1;
243af6ab5fSopenharmony_ci    w : T2;
253af6ab5fSopenharmony_ci}
263af6ab5fSopenharmony_ci
273af6ab5fSopenharmony_citype AliasPrimitive<T> = T;
283af6ab5fSopenharmony_citype AliasAlias<T> = AliasPrimitive<T>;
293af6ab5fSopenharmony_ci
303af6ab5fSopenharmony_citype Alias1Class<T> = C<T>;
313af6ab5fSopenharmony_citype Alias2Class<T> = C<T[]>;
323af6ab5fSopenharmony_citype Alias3Class<T1, T2> = D<T1, T2>;
333af6ab5fSopenharmony_citype Alias4Class<T1, T2> = D<T2, T1>;
343af6ab5fSopenharmony_citype Alias5Class<T1, T2> = D<Alias1Class<T1>, AliasAlias<T2>[]>
353af6ab5fSopenharmony_ci
363af6ab5fSopenharmony_cifunction main() {
373af6ab5fSopenharmony_ci    let v1 : C<double> = new C<double>(1);                     // C<Double>
383af6ab5fSopenharmony_ci    assert(v1.v == 1);
393af6ab5fSopenharmony_ci
403af6ab5fSopenharmony_ci    let v2 : Alias1Class<double> = new C<double>(2);           // C<Double>
413af6ab5fSopenharmony_ci    assert(v2.v == 2);
423af6ab5fSopenharmony_ci
433af6ab5fSopenharmony_ci    let v3 : Alias2Class<double> = new C<double[]>([3.0]);     // C<double[]>
443af6ab5fSopenharmony_ci    assert(v3.v[0] == 3);
453af6ab5fSopenharmony_ci
463af6ab5fSopenharmony_ci    let v4: Alias3Class<double, int> = new D<double, int>(4.0, 5); // D<Double, Int>
473af6ab5fSopenharmony_ci    assert(v4.v == 4.0);
483af6ab5fSopenharmony_ci    assert(v4.w == 5);
493af6ab5fSopenharmony_ci
503af6ab5fSopenharmony_ci    let v5: Alias4Class<double, int> = new D<int, double>(6, 7.0); // D<Int, Double>
513af6ab5fSopenharmony_ci    assert(v5.v == 6);
523af6ab5fSopenharmony_ci    assert(v5.w == 7.0);
533af6ab5fSopenharmony_ci
543af6ab5fSopenharmony_ci    let v6: Alias5Class<double, double> = new D<C<double>, double[]>(new C<double>(8), [9.0]);  // D<C<Double>, double[]>
553af6ab5fSopenharmony_ci    assert(v6.v.v == 8);
563af6ab5fSopenharmony_ci    assert(v6.w[0] == 9.0);
573af6ab5fSopenharmony_ci}
58