1a48e4168Speter klausler //===-- runtime/derived-api.cpp
2a48e4168Speter klausler //-----------------------------------------------===//
3a48e4168Speter klausler //
4a48e4168Speter klausler // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5a48e4168Speter klausler // See https://llvm.org/LICENSE.txt for license information.
6a48e4168Speter klausler // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7a48e4168Speter klausler //
8a48e4168Speter klausler //===----------------------------------------------------------------------===//
9a48e4168Speter klausler 
10*830c0b90SPeter Klausler #include "flang/Runtime/derived-api.h"
11a48e4168Speter klausler #include "derived.h"
12a48e4168Speter klausler #include "terminator.h"
13a48e4168Speter klausler #include "type-info.h"
14*830c0b90SPeter Klausler #include "flang/Runtime/descriptor.h"
15a48e4168Speter klausler 
16a48e4168Speter klausler namespace Fortran::runtime {
17a48e4168Speter klausler 
18a48e4168Speter klausler extern "C" {
19a48e4168Speter klausler 
RTNAME(Initialize)20a48e4168Speter klausler void RTNAME(Initialize)(
21a48e4168Speter klausler     const Descriptor &descriptor, const char *sourceFile, int sourceLine) {
22a48e4168Speter klausler   if (const DescriptorAddendum * addendum{descriptor.Addendum()}) {
23a48e4168Speter klausler     if (const auto *derived{addendum->derivedType()}) {
24a48e4168Speter klausler       if (!derived->noInitializationNeeded()) {
25a48e4168Speter klausler         Terminator terminator{sourceFile, sourceLine};
26a48e4168Speter klausler         Initialize(descriptor, *derived, terminator);
27a48e4168Speter klausler       }
28a48e4168Speter klausler     }
29a48e4168Speter klausler   }
30a48e4168Speter klausler }
31a48e4168Speter klausler 
RTNAME(Destroy)32a48e4168Speter klausler void RTNAME(Destroy)(const Descriptor &descriptor) {
33a48e4168Speter klausler   if (const DescriptorAddendum * addendum{descriptor.Addendum()}) {
34a48e4168Speter klausler     if (const auto *derived{addendum->derivedType()}) {
35a48e4168Speter klausler       if (!derived->noDestructionNeeded()) {
36a48e4168Speter klausler         Destroy(descriptor, true, *derived);
37a48e4168Speter klausler       }
38a48e4168Speter klausler     }
39a48e4168Speter klausler   }
40a48e4168Speter klausler }
41a48e4168Speter klausler 
42a48e4168Speter klausler // TODO: Assign()
43a48e4168Speter klausler 
44a48e4168Speter klausler } // extern "C"
45a48e4168Speter klausler } // namespace Fortran::runtime
46