mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This is a roll-forward of https://github.com/apple/swift/pull/32950, with explicit c++17 version removed from tests. This is not needed since C++17 is the default anyway. -- In this PR we teach `ClangImporter` to import typedef statements with template instantiation as its underlying type. ```c++ template<class T> struct MagicWrapper { T t; }; struct MagicNumber {}; typedef MagicWrapper<MagicNumber> WrappedMagicNumber; ``` will be made available in Swift as if `WrappedMagicNumber` is a regular struct. In C++, multiple distinct typedeffed instantiations resolve to the same canonical type. We implement this by creating a hidden intermediate struct that typedef aliasses. The struct is named as `__CxxTemplateInst` plus Itanium mangled type of the instantiation. For the example above the name of the hidden struct is `__CxxTemplateInst12MagicWrapperI11MagicNumberE`. Double underscore (denoting a reserved C++ identifier) is used to discourage direct usage. We chose Itanium mangling scheme because it produces valid Swift identifiers and covers all C++ edge cases. Imported module interface of the example above: ```swift struct __CxxTemplateInst12MagicWrapperI11MagicNumberE { var t: MagicNumber } struct MagicNumber {} typealias WrappedMagicNumber = __CxxTemplateInst12MagicWrapperI11MagicNumberE ``` We modified the `SwiftLookupTable` logic to show hidden structs in `swift_ide_test` for convenience. Co-authored-by: Rosica Dejanovska <rosica@google.com> Co-authored-by: Dmitri Gribenko <gribozavr@gmail.com> Co-authored-by: Robert Widmann <devteam.codafi@gmail.com>
18 lines
439 B
C++
18 lines
439 B
C++
#ifndef TEST_INTEROP_CXX_TEMPLATES_INPUTS_USING_DIRECTIVE_H
|
|
#define TEST_INTEROP_CXX_TEMPLATES_INPUTS_USING_DIRECTIVE_H
|
|
|
|
template<class T>
|
|
struct MagicWrapper {
|
|
T t;
|
|
int getValuePlusArg(int arg) const { return t.getValue() + arg; }
|
|
};
|
|
|
|
struct IntWrapper {
|
|
int value;
|
|
int getValue() const { return value; }
|
|
};
|
|
|
|
using UsingWrappedMagicNumber = MagicWrapper<IntWrapper>;
|
|
|
|
#endif // TEST_INTEROP_CXX_TEMPLATES_INPUTS_USING_DIRECTIVE_H
|