13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2021-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_ciinterface I {}
173af6ab5fSopenharmony_ci
183af6ab5fSopenharmony_ciclass A {}
193af6ab5fSopenharmony_ciclass B extends A implements I {}
203af6ab5fSopenharmony_cifinal class C extends A implements I {}
213af6ab5fSopenharmony_cifinal class D extends A {}
223af6ab5fSopenharmony_cifinal class F extends B {}
233af6ab5fSopenharmony_ci
243af6ab5fSopenharmony_cifunction foo(p: Object): int {
253af6ab5fSopenharmony_ci  return 1;
263af6ab5fSopenharmony_ci}
273af6ab5fSopenharmony_ci
283af6ab5fSopenharmony_cifunction foo(p: A): int {
293af6ab5fSopenharmony_ci  return 2;
303af6ab5fSopenharmony_ci}
313af6ab5fSopenharmony_ci
323af6ab5fSopenharmony_cifunction foo(p: B): int {
333af6ab5fSopenharmony_ci  return 3;
343af6ab5fSopenharmony_ci}
353af6ab5fSopenharmony_ci
363af6ab5fSopenharmony_cifunction foo(p: C): int {
373af6ab5fSopenharmony_ci  return 4;
383af6ab5fSopenharmony_ci}
393af6ab5fSopenharmony_ci
403af6ab5fSopenharmony_cifunction foo(p: D): int {
413af6ab5fSopenharmony_ci  return 5;
423af6ab5fSopenharmony_ci}
433af6ab5fSopenharmony_ci
443af6ab5fSopenharmony_cifunction foo(p: F): int {
453af6ab5fSopenharmony_ci  return 6;
463af6ab5fSopenharmony_ci}
473af6ab5fSopenharmony_ci
483af6ab5fSopenharmony_ci// #15276 foo(Object|null) and foo(Object) overloads
493af6ab5fSopenharmony_cifunction foo7(p: Object | null): int {
503af6ab5fSopenharmony_ci    return 7;
513af6ab5fSopenharmony_ci}  
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_cifunction main(): void {
543af6ab5fSopenharmony_ci    sameTypeLUB();
553af6ab5fSopenharmony_ci    objectLUB();
563af6ab5fSopenharmony_ci    forkSubtypeLUB();
573af6ab5fSopenharmony_ci}
583af6ab5fSopenharmony_ci
593af6ab5fSopenharmony_cifunction sameTypeLUB(): void {
603af6ab5fSopenharmony_ci    let a : A = new A();
613af6ab5fSopenharmony_ci    let b : A = new A();
623af6ab5fSopenharmony_ci    let c = true ? a : b;
633af6ab5fSopenharmony_ci    assert(foo(c) == 2);
643af6ab5fSopenharmony_ci}
653af6ab5fSopenharmony_ci
663af6ab5fSopenharmony_cifunction objectLUB(): void {
673af6ab5fSopenharmony_ci    let a : A = new A();
683af6ab5fSopenharmony_ci    let b : Int = 2;
693af6ab5fSopenharmony_ci    let c = true ? a : b;
703af6ab5fSopenharmony_ci    assert(foo(c) == 1);
713af6ab5fSopenharmony_ci
723af6ab5fSopenharmony_ci    let arr : Int[] | null = null;
733af6ab5fSopenharmony_ci    let d = true ? a : arr;
743af6ab5fSopenharmony_ci    assert(foo7(d) == 7);
753af6ab5fSopenharmony_ci}
763af6ab5fSopenharmony_ci
773af6ab5fSopenharmony_cifunction forkSubtypeLUB(): void {
783af6ab5fSopenharmony_ci    let a : F = new F();
793af6ab5fSopenharmony_ci    let b : D = new D();
803af6ab5fSopenharmony_ci    let c = true ? a : b;
813af6ab5fSopenharmony_ci    assert(foo(c) == 2);
823af6ab5fSopenharmony_ci    let d : A = new A();
833af6ab5fSopenharmony_ci    let e = true ? a : b;
843af6ab5fSopenharmony_ci    assert(foo(e) == 2);
853af6ab5fSopenharmony_ci    let f : B = new B();
863af6ab5fSopenharmony_ci    let g = true ? a : f;
873af6ab5fSopenharmony_ci    assert(foo(g) == 3);
883af6ab5fSopenharmony_ci}
89