| -- { dg-do compile } |
| |
| procedure Private_Overriding is |
| |
| package Foo is |
| |
| type Bar is abstract tagged null record; |
| |
| procedure Overloaded_Subprogram |
| (Self : in out Bar) |
| is abstract; |
| |
| procedure Overloaded_Subprogram |
| (Self : in out Bar; |
| P1 : Integer) |
| is abstract; |
| |
| procedure Not_Overloaded_Subprogram |
| (Self : in out Bar) |
| is abstract; |
| |
| |
| type Baz is new Bar with null record; |
| -- promise to override both overloaded subprograms, |
| -- shouldn't matter that they're defined in the private part, |
| |
| private -- workaround: override in the public view |
| |
| overriding |
| procedure Overloaded_Subprogram |
| (Self : in out Baz) |
| is null; |
| |
| overriding |
| procedure Overloaded_Subprogram |
| (Self : in out Baz; |
| P1 : Integer) |
| is null; |
| |
| overriding |
| procedure Not_Overloaded_Subprogram |
| (Self : in out Baz) |
| is null; |
| |
| end Foo; |
| |
| Qux : Foo.Baz; |
| begin |
| |
| -- this is allowed, as expected |
| Foo.Not_Overloaded_Subprogram(Qux); |
| Foo.Overloaded_Subprogram(Qux); |
| Foo.Overloaded_Subprogram(Foo.Baz'Class(Qux)); |
| Foo.Overloaded_Subprogram(Foo.Bar'Class(Qux)); |
| |
| -- however, using object-dot notation |
| Qux.Not_Overloaded_Subprogram; -- this is allowed |
| Qux.Overloaded_Subprogram; -- "no selector..." |
| Foo.Baz'Class(Qux).Overloaded_Subprogram; -- "no selector..." |
| Foo.Bar'Class(Qux).Overloaded_Subprogram; -- this is allowed |
| |
| end Private_Overriding; |