56#include "llvm/ADT/ArrayRef.h"
57#include "llvm/ADT/DenseMap.h"
58#include "llvm/ADT/STLExtras.h"
59#include "llvm/ADT/ScopeExit.h"
60#include "llvm/ADT/SmallVector.h"
61#include "llvm/Support/ErrorHandling.h"
62#include "llvm/Support/MemoryBuffer.h"
73 using llvm::make_error;
88 return "NameConflict";
90 return "UnsupportedConstruct";
92 return "Unknown error";
94 llvm_unreachable(
"Invalid error code.");
95 return "Invalid error code.";
101 llvm_unreachable(
"Function not implemented.");
110 for (
auto *R :
D->getFirstDecl()->
redecls()) {
111 if (R !=
D->getFirstDecl())
112 Redecls.push_back(R);
114 Redecls.push_back(
D->getFirstDecl());
115 std::reverse(Redecls.begin(), Redecls.end());
120 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
121 return getCanonicalForwardRedeclChain<FunctionDecl>(FD);
122 if (
auto *VD = dyn_cast<VarDecl>(
D))
123 return getCanonicalForwardRedeclChain<VarDecl>(VD);
124 if (
auto *TD = dyn_cast<TagDecl>(
D))
125 return getCanonicalForwardRedeclChain<TagDecl>(TD);
126 llvm_unreachable(
"Bad declaration kind");
147 bool const IgnoreChildErrors;
151 : FromDC(FromDC), IgnoreChildErrors(!
isa<
TagDecl>(FromDC)) {}
161 if (ChildErr && !IgnoreChildErrors)
162 ResultErr = joinErrors(std::move(ResultErr), std::move(ChildErr));
164 consumeError(std::move(ChildErr));
170 if (!IgnoreChildErrors || !FromDC)
178 public StmtVisitor<ASTNodeImporter, ExpectedStmt> {
182 template <
typename ImportT>
183 [[nodiscard]] Error importInto(ImportT &To,
const ImportT &From) {
188 template <
typename ImportT>
189 [[nodiscard]] Error importInto(ImportT *&To, ImportT *From) {
190 auto ToOrErr = Importer.
Import(From);
192 To = cast_or_null<ImportT>(*ToOrErr);
193 return ToOrErr.takeError();
198 template <
typename T>
202 auto ToOrErr = Importer.
Import(From);
204 return ToOrErr.takeError();
205 return cast_or_null<T>(*ToOrErr);
208 template <
typename T>
209 auto import(
const T *From) {
210 return import(
const_cast<T *
>(From));
214 template <
typename T>
216 return Importer.
Import(From);
220 template <
typename T>
224 return import(*From);
231 template <
typename ToDeclT>
struct CallOverloadedCreateFun {
232 template <
typename... Args>
decltype(
auto)
operator()(Args &&... args) {
233 return ToDeclT::Create(std::forward<Args>(args)...);
243 template <
typename ToDeclT,
typename FromDeclT,
typename... Args>
244 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
249 CallOverloadedCreateFun<ToDeclT> OC;
250 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
251 std::forward<Args>(args)...);
258 template <
typename NewDeclT,
typename ToDeclT,
typename FromDeclT,
260 [[nodiscard]]
bool GetImportedOrCreateDecl(ToDeclT *&ToD, FromDeclT *FromD,
262 CallOverloadedCreateFun<NewDeclT> OC;
263 return GetImportedOrCreateSpecialDecl(ToD, OC, FromD,
264 std::forward<Args>(args)...);
268 template <
typename ToDeclT,
typename CreateFunT,
typename FromDeclT,
271 GetImportedOrCreateSpecialDecl(ToDeclT *&ToD, CreateFunT CreateFun,
272 FromDeclT *FromD, Args &&...args) {
280 ToD = CreateFun(std::forward<Args>(args)...);
283 Importer.SharedState->markAsNewDecl(ToD);
284 InitializeImportedDecl(FromD, ToD);
288 void InitializeImportedDecl(
Decl *FromD,
Decl *ToD) {
292 if (FromD->isImplicit())
300 if (
D->doesThisDeclarationHaveABody() &&
306 void addDeclToContexts(
Decl *FromD,
Decl *ToD) {
311 if (!FromD->getDescribedTemplate() &&
318 DeclContext *FromLexicalDC = FromD->getLexicalDeclContext();
322 bool Visible =
false;
335 if (
auto *FromNamed = dyn_cast<NamedDecl>(FromD)) {
336 auto *ToNamed = cast<NamedDecl>(ToD);
338 FromDC->
lookup(FromNamed->getDeclName());
339 if (llvm::is_contained(FromLookup, FromNamed))
356 updateLookupTableForTemplateParameters(
360 template <
typename TemplateParmDeclT>
361 Error importTemplateParameterDefaultArgument(
const TemplateParmDeclT *
D,
362 TemplateParmDeclT *ToD) {
363 if (
D->hasDefaultArgument()) {
364 if (
D->defaultArgumentWasInherited()) {
366 import(
D->getDefaultArgStorage().getInheritedFrom());
367 if (!ToInheritedFromOrErr)
368 return ToInheritedFromOrErr.takeError();
369 TemplateParmDeclT *ToInheritedFrom = *ToInheritedFromOrErr;
370 if (!ToInheritedFrom->hasDefaultArgument()) {
374 import(
D->getDefaultArgStorage()
376 ->getDefaultArgument());
377 if (!ToInheritedDefaultArgOrErr)
378 return ToInheritedDefaultArgOrErr.takeError();
379 ToInheritedFrom->setDefaultArgument(Importer.
getToContext(),
380 *ToInheritedDefaultArgOrErr);
382 ToD->setInheritedDefaultArgument(ToD->getASTContext(),
386 import(
D->getDefaultArgument());
387 if (!ToDefaultArgOrErr)
388 return ToDefaultArgOrErr.takeError();
391 if (!ToD->hasDefaultArgument())
396 return Error::success();
408#define TYPE(Class, Base) \
409 ExpectedType Visit##Class##Type(const Class##Type *T);
410#include "clang/AST/TypeNodes.inc"
468 template <
typename InContainerTy>
472 template<
typename InContainerTy>
479 std::tuple<FunctionTemplateDecl *, TemplateArgsTy>;
484 template <
typename DeclTy>
497 template <
typename T>
501 bool IgnoreTemplateParmDepth =
false);
693 Err = MaybeVal.takeError();
699 template<
typename IIter,
typename OIter>
701 using ItemT = std::remove_reference_t<
decltype(*Obegin)>;
702 for (; Ibegin != Iend; ++Ibegin, ++Obegin) {
705 return ToOrErr.takeError();
708 return Error::success();
715 template<
typename InContainerTy,
typename OutContainerTy>
717 const InContainerTy &InContainer, OutContainerTy &OutContainer) {
719 InContainer.begin(), InContainer.end(), OutContainer.begin());
722 template<
typename InContainerTy,
typename OIter>
739template <
typename InContainerTy>
743 auto ToLAngleLocOrErr =
import(FromLAngleLoc);
744 if (!ToLAngleLocOrErr)
745 return ToLAngleLocOrErr.takeError();
746 auto ToRAngleLocOrErr =
import(FromRAngleLoc);
747 if (!ToRAngleLocOrErr)
748 return ToRAngleLocOrErr.takeError();
754 return Error::success();
758Error ASTNodeImporter::ImportTemplateArgumentListInfo<TemplateArgumentListInfo>(
769 return ImportTemplateArgumentListInfo(
770 From.LAngleLoc, From.RAngleLoc, From.arguments(),
Result);
782 if (Error Err = importInto(std::get<0>(
Result), FTSInfo->getTemplate()))
783 return std::move(Err);
788 return std::move(Err);
798 return std::move(Err);
801 if (!ToRequiresClause)
802 return ToRequiresClause.takeError();
805 if (!ToTemplateLocOrErr)
806 return ToTemplateLocOrErr.takeError();
808 if (!ToLAngleLocOrErr)
809 return ToLAngleLocOrErr.takeError();
811 if (!ToRAngleLocOrErr)
812 return ToRAngleLocOrErr.takeError();
833 return ToTypeOrErr.takeError();
841 return ToTypeOrErr.takeError();
848 return ToOrErr.takeError();
851 return ToTypeOrErr.takeError();
852 return TemplateArgument(dyn_cast<ValueDecl>((*ToOrErr)->getCanonicalDecl()),
859 return ToTypeOrErr.takeError();
867 return ToTypeOrErr.takeError();
870 return ToValueOrErr.takeError();
877 if (!ToTemplateOrErr)
878 return ToTemplateOrErr.takeError();
886 if (!ToTemplateOrErr)
887 return ToTemplateOrErr.takeError();
897 return ToExpr.takeError();
903 return std::move(Err);
910 llvm_unreachable(
"Invalid template argument kind");
918 return ArgOrErr.takeError();
927 return E.takeError();
933 return TSIOrErr.takeError();
935 auto ToTemplateQualifierLocOrErr =
937 if (!ToTemplateQualifierLocOrErr)
938 return ToTemplateQualifierLocOrErr.takeError();
940 if (!ToTemplateNameLocOrErr)
941 return ToTemplateNameLocOrErr.takeError();
942 auto ToTemplateEllipsisLocOrErr =
944 if (!ToTemplateEllipsisLocOrErr)
945 return ToTemplateEllipsisLocOrErr.takeError();
948 *ToTemplateNameLocOrErr, *ToTemplateEllipsisLocOrErr);
958 size_t NumDecls = DG.
end() - DG.
begin();
960 ToDecls.reserve(NumDecls);
961 for (
Decl *FromD : DG) {
962 if (
auto ToDOrErr =
import(FromD))
963 ToDecls.push_back(*ToDOrErr);
965 return ToDOrErr.takeError();
975 if (
D.isFieldDesignator()) {
980 return ToDotLocOrErr.takeError();
983 if (!ToFieldLocOrErr)
984 return ToFieldLocOrErr.takeError();
987 ToFieldName, *ToDotLocOrErr, *ToFieldLocOrErr);
990 ExpectedSLoc ToLBracketLocOrErr =
import(
D.getLBracketLoc());
991 if (!ToLBracketLocOrErr)
992 return ToLBracketLocOrErr.takeError();
994 ExpectedSLoc ToRBracketLocOrErr =
import(
D.getRBracketLoc());
995 if (!ToRBracketLocOrErr)
996 return ToRBracketLocOrErr.takeError();
998 if (
D.isArrayDesignator())
1000 *ToLBracketLocOrErr,
1001 *ToRBracketLocOrErr);
1003 ExpectedSLoc ToEllipsisLocOrErr =
import(
D.getEllipsisLoc());
1004 if (!ToEllipsisLocOrErr)
1005 return ToEllipsisLocOrErr.takeError();
1007 assert(
D.isArrayRangeDesignator());
1009 D.getArrayIndex(), *ToLBracketLocOrErr, *ToEllipsisLocOrErr,
1010 *ToRBracketLocOrErr);
1015 Error Err = Error::success();
1018 auto ToConceptNameLoc =
1024 return std::move(Err);
1027 if (ASTTemplateArgs)
1029 return std::move(Err);
1047 return VarOrErr.takeError();
1052 return LocationOrErr.takeError();
1057 return std::move(Err);
1064template <
typename T>
1066 if (
Found->getLinkageInternal() != From->getLinkageInternal())
1069 if (From->hasExternalFormalLinkage())
1070 return Found->hasExternalFormalLinkage();
1073 if (From->isInAnonymousNamespace())
1074 return Found->isInAnonymousNamespace();
1076 return !
Found->isInAnonymousNamespace() &&
1077 !
Found->hasExternalFormalLinkage();
1097using namespace clang;
1106 ExpectedType UnderlyingTypeOrErr =
import(
T->getValueType());
1107 if (!UnderlyingTypeOrErr)
1108 return UnderlyingTypeOrErr.takeError();
1114 switch (
T->getKind()) {
1115#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1116 case BuiltinType::Id: \
1117 return Importer.getToContext().SingletonId;
1118#include "clang/Basic/OpenCLImageTypes.def"
1119#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1120 case BuiltinType::Id: \
1121 return Importer.getToContext().Id##Ty;
1122#include "clang/Basic/OpenCLExtensionTypes.def"
1123#define SVE_TYPE(Name, Id, SingletonId) \
1124 case BuiltinType::Id: \
1125 return Importer.getToContext().SingletonId;
1126#include "clang/Basic/AArch64SVEACLETypes.def"
1127#define PPC_VECTOR_TYPE(Name, Id, Size) \
1128 case BuiltinType::Id: \
1129 return Importer.getToContext().Id##Ty;
1130#include "clang/Basic/PPCTypes.def"
1131#define RVV_TYPE(Name, Id, SingletonId) \
1132 case BuiltinType::Id: \
1133 return Importer.getToContext().SingletonId;
1134#include "clang/Basic/RISCVVTypes.def"
1135#define WASM_TYPE(Name, Id, SingletonId) \
1136 case BuiltinType::Id: \
1137 return Importer.getToContext().SingletonId;
1138#include "clang/Basic/WebAssemblyReferenceTypes.def"
1139#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1140 case BuiltinType::Id: \
1141 return Importer.getToContext().SingletonId;
1142#include "clang/Basic/AMDGPUTypes.def"
1143#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1144 case BuiltinType::Id: \
1145 return Importer.getToContext().SingletonId;
1146#include "clang/Basic/HLSLIntangibleTypes.def"
1147#define SHARED_SINGLETON_TYPE(Expansion)
1148#define BUILTIN_TYPE(Id, SingletonId) \
1149 case BuiltinType::Id: return Importer.getToContext().SingletonId;
1150#include "clang/AST/BuiltinTypes.def"
1158 case BuiltinType::Char_U:
1167 case BuiltinType::Char_S:
1176 case BuiltinType::WChar_S:
1177 case BuiltinType::WChar_U:
1183 llvm_unreachable(
"Invalid BuiltinType Kind!");
1187 ExpectedType ToOriginalTypeOrErr =
import(
T->getOriginalType());
1188 if (!ToOriginalTypeOrErr)
1189 return ToOriginalTypeOrErr.takeError();
1195 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1196 if (!ToElementTypeOrErr)
1197 return ToElementTypeOrErr.takeError();
1204 if (!ToPointeeTypeOrErr)
1205 return ToPointeeTypeOrErr.takeError();
1213 if (!ToPointeeTypeOrErr)
1214 return ToPointeeTypeOrErr.takeError();
1222 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1223 if (!ToPointeeTypeOrErr)
1224 return ToPointeeTypeOrErr.takeError();
1232 ExpectedType ToPointeeTypeOrErr =
import(
T->getPointeeTypeAsWritten());
1233 if (!ToPointeeTypeOrErr)
1234 return ToPointeeTypeOrErr.takeError();
1243 if (!ToPointeeTypeOrErr)
1244 return ToPointeeTypeOrErr.takeError();
1247 if (!ClassTypeOrErr)
1248 return ClassTypeOrErr.takeError();
1256 Error Err = Error::success();
1260 return std::move(Err);
1263 ToElementType,
T->getSize(), ToSizeExpr,
T->getSizeModifier(),
1264 T->getIndexTypeCVRQualifiers());
1270 if (!ToArrayTypeOrErr)
1271 return ToArrayTypeOrErr.takeError();
1278 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1279 if (!ToElementTypeOrErr)
1280 return ToElementTypeOrErr.takeError();
1283 T->getSizeModifier(),
1284 T->getIndexTypeCVRQualifiers());
1289 Error Err = Error::success();
1294 return std::move(Err);
1296 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1297 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
1300ExpectedType ASTNodeImporter::VisitDependentSizedArrayType(
1302 Error Err = Error::success();
1307 return std::move(Err);
1312 ToElementType, ToSizeExpr,
T->getSizeModifier(),
1313 T->getIndexTypeCVRQualifiers(), ToBracketsRange);
1316ExpectedType ASTNodeImporter::VisitDependentSizedExtVectorType(
1318 Error Err = Error::success();
1323 return std::move(Err);
1325 ToElementType, ToSizeExpr, ToAttrLoc);
1329 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1330 if (!ToElementTypeOrErr)
1331 return ToElementTypeOrErr.takeError();
1334 T->getNumElements(),
1335 T->getVectorKind());
1339 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1340 if (!ToElementTypeOrErr)
1341 return ToElementTypeOrErr.takeError();
1344 T->getNumElements());
1352 if (!ToReturnTypeOrErr)
1353 return ToReturnTypeOrErr.takeError();
1362 if (!ToReturnTypeOrErr)
1363 return ToReturnTypeOrErr.takeError();
1370 return TyOrErr.takeError();
1371 ArgTypes.push_back(*TyOrErr);
1379 return TyOrErr.takeError();
1380 ExceptionTypes.push_back(*TyOrErr);
1384 Error Err = Error::success();
1401 return std::move(Err);
1404 *ToReturnTypeOrErr, ArgTypes, ToEPI);
1409 Error Err = Error::success();
1411 auto ToPrevD =
importChecked(Err,
T->getDecl()->getPreviousDecl());
1413 return std::move(Err);
1416 ToD, cast_or_null<TypeDecl>(ToPrevD));
1421 if (!ToInnerTypeOrErr)
1422 return ToInnerTypeOrErr.takeError();
1432 return Pattern.takeError();
1435 return Index.takeError();
1442 return ToDeclOrErr.takeError();
1449 if (!ToUnderlyingTypeOrErr)
1450 return ToUnderlyingTypeOrErr.takeError();
1458 return ToExprOrErr.takeError();
1463 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnmodifiedType());
1464 if (!ToUnderlyingTypeOrErr)
1465 return ToUnderlyingTypeOrErr.takeError();
1473 return FoundOrErr.takeError();
1475 if (!UnderlyingOrErr)
1476 return UnderlyingOrErr.takeError();
1485 return ToExprOrErr.takeError();
1487 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1488 if (!ToUnderlyingTypeOrErr)
1489 return ToUnderlyingTypeOrErr.takeError();
1492 *ToExprOrErr, *ToUnderlyingTypeOrErr);
1498 if (!ToBaseTypeOrErr)
1499 return ToBaseTypeOrErr.takeError();
1501 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1502 if (!ToUnderlyingTypeOrErr)
1503 return ToUnderlyingTypeOrErr.takeError();
1506 *ToBaseTypeOrErr, *ToUnderlyingTypeOrErr,
T->getUTTKind());
1511 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1512 if (!ToDeducedTypeOrErr)
1513 return ToDeducedTypeOrErr.takeError();
1515 ExpectedDecl ToTypeConstraintConcept =
import(
T->getTypeConstraintConcept());
1516 if (!ToTypeConstraintConcept)
1517 return ToTypeConstraintConcept.takeError();
1522 return std::move(Err);
1525 *ToDeducedTypeOrErr,
T->getKeyword(),
false,
1526 false, cast_or_null<ConceptDecl>(*ToTypeConstraintConcept),
1530ExpectedType ASTNodeImporter::VisitDeducedTemplateSpecializationType(
1534 if (!ToTemplateNameOrErr)
1535 return ToTemplateNameOrErr.takeError();
1536 ExpectedType ToDeducedTypeOrErr =
import(
T->getDeducedType());
1537 if (!ToDeducedTypeOrErr)
1538 return ToDeducedTypeOrErr.takeError();
1544ExpectedType ASTNodeImporter::VisitInjectedClassNameType(
1548 return ToDeclOrErr.takeError();
1552 const Type *Ty = (*ToDeclOrErr)->getTypeForDecl();
1553 assert(isa_and_nonnull<InjectedClassNameType>(Ty));
1560 return ToDeclOrErr.takeError();
1568 return ToDeclOrErr.takeError();
1574 ExpectedType ToModifiedTypeOrErr =
import(
T->getModifiedType());
1575 if (!ToModifiedTypeOrErr)
1576 return ToModifiedTypeOrErr.takeError();
1577 ExpectedType ToEquivalentTypeOrErr =
import(
T->getEquivalentType());
1578 if (!ToEquivalentTypeOrErr)
1579 return ToEquivalentTypeOrErr.takeError();
1582 T->getAttrKind(), *ToModifiedTypeOrErr, *ToEquivalentTypeOrErr,
1589 if (!ToWrappedTypeOrErr)
1590 return ToWrappedTypeOrErr.takeError();
1592 Error Err = Error::success();
1599 return ToDeclOrErr.takeError();
1600 CoupledDecls.emplace_back(*ToDeclOrErr, TI.isDeref());
1604 *ToWrappedTypeOrErr, CountExpr,
T->isCountInBytes(),
T->isOrNull(),
1605 ArrayRef(CoupledDecls.data(), CoupledDecls.size()));
1608ExpectedType ASTNodeImporter::VisitTemplateTypeParmType(
1612 return ToDeclOrErr.takeError();
1615 T->getDepth(),
T->getIndex(),
T->isParameterPack(), *ToDeclOrErr);
1618ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmType(
1622 return ReplacedOrErr.takeError();
1624 ExpectedType ToReplacementTypeOrErr =
import(
T->getReplacementType());
1625 if (!ToReplacementTypeOrErr)
1626 return ToReplacementTypeOrErr.takeError();
1629 *ToReplacementTypeOrErr, *ReplacedOrErr,
T->getIndex(),
T->getPackIndex(),
1630 T->getSubstitutionFlag());
1633ExpectedType ASTNodeImporter::VisitSubstTemplateTypeParmPackType(
1637 return ReplacedOrErr.takeError();
1640 if (!ToArgumentPack)
1641 return ToArgumentPack.takeError();
1644 *ReplacedOrErr,
T->getIndex(),
T->getFinal(), *ToArgumentPack);
1647ExpectedType ASTNodeImporter::VisitTemplateSpecializationType(
1649 auto ToTemplateOrErr =
import(
T->getTemplateName());
1650 if (!ToTemplateOrErr)
1651 return ToTemplateOrErr.takeError();
1656 return std::move(Err);
1663 ToCanonType = *TyOrErr;
1665 return TyOrErr.takeError();
1674 auto ToQualifierOrErr =
import(
T->getQualifier());
1675 if (!ToQualifierOrErr)
1676 return ToQualifierOrErr.takeError();
1679 if (!ToNamedTypeOrErr)
1680 return ToNamedTypeOrErr.takeError();
1683 if (!ToOwnedTagDeclOrErr)
1684 return ToOwnedTagDeclOrErr.takeError();
1689 *ToOwnedTagDeclOrErr);
1695 if (!ToPatternOrErr)
1696 return ToPatternOrErr.takeError();
1699 T->getNumExpansions(),
1703ExpectedType ASTNodeImporter::VisitDependentTemplateSpecializationType(
1705 auto ToQualifierOrErr =
import(
T->getQualifier());
1706 if (!ToQualifierOrErr)
1707 return ToQualifierOrErr.takeError();
1712 ToPack.reserve(
T->template_arguments().size());
1714 return std::move(Err);
1717 T->getKeyword(), *ToQualifierOrErr, ToName, ToPack);
1722 auto ToQualifierOrErr =
import(
T->getQualifier());
1723 if (!ToQualifierOrErr)
1724 return ToQualifierOrErr.takeError();
1733 return TyOrErr.takeError();
1745 return ToDeclOrErr.takeError();
1752 if (!ToBaseTypeOrErr)
1753 return ToBaseTypeOrErr.takeError();
1756 for (
auto TypeArg :
T->getTypeArgsAsWritten()) {
1758 TypeArgs.push_back(*TyOrErr);
1760 return TyOrErr.takeError();
1764 for (
auto *
P :
T->quals()) {
1766 Protocols.push_back(*ProtocolOrErr);
1768 return ProtocolOrErr.takeError();
1774 T->isKindOfTypeAsWritten());
1780 if (!ToPointeeTypeOrErr)
1781 return ToPointeeTypeOrErr.takeError();
1788 ExpectedType ToUnderlyingTypeOrErr =
import(
T->getUnderlyingType());
1789 if (!ToUnderlyingTypeOrErr)
1790 return ToUnderlyingTypeOrErr.takeError();
1798 Error Err = Error::success();
1799 QualType ToOriginalType = importChecked(Err,
T->getOriginalType());
1800 QualType ToAdjustedType = importChecked(Err,
T->getAdjustedType());
1802 return std::move(Err);
1804 return Importer.getToContext().getAdjustedType(ToOriginalType,
1809 return Importer.getToContext().getBitIntType(
T->isUnsigned(),
1813ExpectedType clang::ASTNodeImporter::VisitBTFTagAttributedType(
1815 Error Err = Error::success();
1816 const BTFTypeTagAttr *ToBTFAttr = importChecked(Err,
T->getAttr());
1817 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
1819 return std::move(Err);
1821 return Importer.getToContext().getBTFTagAttributedType(ToBTFAttr,
1825ExpectedType clang::ASTNodeImporter::VisitHLSLAttributedResourceType(
1827 Error Err = Error::success();
1829 QualType ToWrappedType = importChecked(Err,
T->getWrappedType());
1830 QualType ToContainedType = importChecked(Err,
T->getContainedType());
1832 return std::move(Err);
1834 return Importer.getToContext().getHLSLAttributedResourceType(
1835 ToWrappedType, ToContainedType, ToAttrs);
1838ExpectedType clang::ASTNodeImporter::VisitConstantMatrixType(
1840 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1841 if (!ToElementTypeOrErr)
1842 return ToElementTypeOrErr.takeError();
1844 return Importer.getToContext().getConstantMatrixType(
1845 *ToElementTypeOrErr,
T->getNumRows(),
T->getNumColumns());
1848ExpectedType clang::ASTNodeImporter::VisitDependentAddressSpaceType(
1850 Error Err = Error::success();
1852 Expr *ToAddrSpaceExpr = importChecked(Err,
T->getAddrSpaceExpr());
1855 return std::move(Err);
1857 return Importer.getToContext().getDependentAddressSpaceType(
1858 ToPointeeType, ToAddrSpaceExpr, ToAttrLoc);
1861ExpectedType clang::ASTNodeImporter::VisitDependentBitIntType(
1863 ExpectedExpr ToNumBitsExprOrErr =
import(
T->getNumBitsExpr());
1864 if (!ToNumBitsExprOrErr)
1865 return ToNumBitsExprOrErr.takeError();
1866 return Importer.getToContext().getDependentBitIntType(
T->isUnsigned(),
1867 *ToNumBitsExprOrErr);
1870ExpectedType clang::ASTNodeImporter::VisitDependentSizedMatrixType(
1872 Error Err = Error::success();
1873 QualType ToElementType = importChecked(Err,
T->getElementType());
1874 Expr *ToRowExpr = importChecked(Err,
T->getRowExpr());
1875 Expr *ToColumnExpr = importChecked(Err,
T->getColumnExpr());
1878 return std::move(Err);
1880 return Importer.getToContext().getDependentSizedMatrixType(
1881 ToElementType, ToRowExpr, ToColumnExpr, ToAttrLoc);
1884ExpectedType clang::ASTNodeImporter::VisitDependentVectorType(
1886 Error Err = Error::success();
1887 QualType ToElementType = importChecked(Err,
T->getElementType());
1888 Expr *ToSizeExpr = importChecked(Err,
T->getSizeExpr());
1891 return std::move(Err);
1893 return Importer.getToContext().getDependentVectorType(
1894 ToElementType, ToSizeExpr, ToAttrLoc,
T->getVectorKind());
1897ExpectedType clang::ASTNodeImporter::VisitObjCTypeParamType(
1901 return ToDeclOrErr.takeError();
1906 if (!ToProtocolOrErr)
1907 return ToProtocolOrErr.takeError();
1908 ToProtocols.push_back(*ToProtocolOrErr);
1911 return Importer.getToContext().getObjCTypeParamType(*ToDeclOrErr,
1916 ExpectedType ToElementTypeOrErr =
import(
T->getElementType());
1917 if (!ToElementTypeOrErr)
1918 return ToElementTypeOrErr.takeError();
1921 if (
T->isReadOnly())
1941 if (isa<RecordDecl>(
D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) &&
1943 auto getLeafPointeeType = [](
const Type *
T) {
1951 getLeafPointeeType(
P->getType().getCanonicalType().getTypePtr());
1952 auto *RT = dyn_cast<RecordType>(LeafT);
1953 if (RT && RT->getDecl() ==
D) {
1966 if (Error Err = importInto(Name,
D->getDeclName()))
1978 return Error::success();
1985 if (Error Err = importInto(Name,
D->getDeclName()))
1997 return Error::success();
2002 return Error::success();
2005 if (Error Err = importInto(ToD, FromD))
2008 if (
RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
2009 if (
RecordDecl *ToRecord = cast<RecordDecl>(ToD)) {
2010 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() &&
2011 !ToRecord->getDefinition()) {
2016 return Error::success();
2019 if (
EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
2020 if (
EnumDecl *ToEnum = cast<EnumDecl>(ToD)) {
2021 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
2026 return Error::success();
2029 return Error::success();
2044 return Error::success();
2050 return ToRangeOrErr.takeError();
2051 return Error::success();
2057 return LocOrErr.takeError();
2058 return Error::success();
2066 return ToTInfoOrErr.takeError();
2067 return Error::success();
2070 llvm_unreachable(
"Unknown name kind.");
2077 return ToDCOrErr.takeError();
2091 auto MightNeedReordering = [](
const Decl *
D) {
2092 return isa<FieldDecl>(
D) || isa<IndirectFieldDecl>(
D) || isa<FriendDecl>(
D);
2096 Error ChildErrors = Error::success();
2097 for (
auto *From : FromDC->
decls()) {
2098 if (!MightNeedReordering(From))
2107 if (!ImportedOrErr) {
2109 ImportedOrErr.takeError());
2112 FieldDecl *FieldFrom = dyn_cast_or_null<FieldDecl>(From);
2113 Decl *ImportedDecl = *ImportedOrErr;
2114 FieldDecl *FieldTo = dyn_cast_or_null<FieldDecl>(ImportedDecl);
2115 if (FieldFrom && FieldTo) {
2147 consumeError(std::move(ChildErrors));
2148 return ToDCOrErr.takeError();
2151 if (
const auto *FromRD = dyn_cast<RecordDecl>(FromDC)) {
2155 for (
auto *
D : FromRD->decls()) {
2156 if (!MightNeedReordering(
D))
2159 assert(
D &&
"DC contains a null decl");
2162 assert(ToDC == ToD->getLexicalDeclContext() && ToDC->
containsDecl(ToD));
2174 for (
auto *From : FromDC->
decls()) {
2175 if (MightNeedReordering(From))
2181 ImportedOrErr.takeError());
2201 if (!FromRecordDecl || !ToRecordDecl) {
2205 if (RecordFrom && RecordTo) {
2206 FromRecordDecl = RecordFrom->
getDecl();
2207 ToRecordDecl = RecordTo->getDecl();
2211 if (FromRecordDecl && ToRecordDecl) {
2217 return Error::success();
2224 return ToDCOrErr.takeError();
2230 if (!ToLexicalDCOrErr)
2231 return ToLexicalDCOrErr.takeError();
2232 ToLexicalDC = *ToLexicalDCOrErr;
2236 return Error::success();
2242 "Import implicit methods to or from non-definition");
2245 if (FromM->isImplicit()) {
2248 return ToMOrErr.takeError();
2251 return Error::success();
2260 return ToTypedefOrErr.takeError();
2262 return Error::success();
2267 auto DefinitionCompleter = [To]() {
2286 auto *FromCXXRD = cast<CXXRecordDecl>(From);
2288 ToCaptures.reserve(FromCXXRD->capture_size());
2289 for (
const auto &FromCapture : FromCXXRD->captures()) {
2290 if (
auto ToCaptureOrErr =
import(FromCapture))
2291 ToCaptures.push_back(*ToCaptureOrErr);
2293 return ToCaptureOrErr.takeError();
2295 cast<CXXRecordDecl>(To)->setCaptures(Importer.
getToContext(),
2302 DefinitionCompleter();
2306 return Error::success();
2321 auto DefinitionCompleterScopeExit =
2322 llvm::make_scope_exit(DefinitionCompleter);
2328 auto *ToCXX = dyn_cast<CXXRecordDecl>(To);
2329 auto *FromCXX = dyn_cast<CXXRecordDecl>(From);
2330 if (ToCXX && FromCXX && ToCXX->dataPtr() && FromCXX->dataPtr()) {
2332 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
2333 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
2335 #define FIELD(Name, Width, Merge) \
2336 ToData.Name = FromData.Name;
2337 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2340 ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
2343 for (
const auto &Base1 : FromCXX->bases()) {
2346 return TyOrErr.takeError();
2349 if (Base1.isPackExpansion()) {
2350 if (
ExpectedSLoc LocOrErr =
import(Base1.getEllipsisLoc()))
2351 EllipsisLoc = *LocOrErr;
2353 return LocOrErr.takeError();
2361 auto RangeOrErr =
import(Base1.getSourceRange());
2363 return RangeOrErr.takeError();
2365 auto TSIOrErr =
import(Base1.getTypeSourceInfo());
2367 return TSIOrErr.takeError();
2373 Base1.isBaseOfClass(),
2374 Base1.getAccessSpecifierAsWritten(),
2379 ToCXX->setBases(Bases.data(), Bases.size());
2387 return Error::success();
2392 return Error::success();
2396 return Error::success();
2400 return ToInitOrErr.takeError();
2411 return Error::success();
2419 return Error::success();
2430 return ToTypeOrErr.takeError();
2433 if (!ToPromotionTypeOrErr)
2434 return ToPromotionTypeOrErr.takeError();
2445 return Error::success();
2451 for (
const auto &Arg : FromArgs) {
2452 if (
auto ToOrErr =
import(Arg))
2453 ToArgs.push_back(*ToOrErr);
2455 return ToOrErr.takeError();
2458 return Error::success();
2464 return import(From);
2467template <
typename InContainerTy>
2470 for (
const auto &FromLoc : Container) {
2471 if (
auto ToLocOrErr =
import(FromLoc))
2474 return ToLocOrErr.takeError();
2476 return Error::success();
2486 bool IgnoreTemplateParmDepth) {
2497 false, Complain,
false,
2498 IgnoreTemplateParmDepth);
2518 return std::move(Err);
2523 return LocOrErr.takeError();
2526 if (GetImportedOrCreateDecl(ToD,
D, Importer.
getToContext(), DC, *LocOrErr))
2549 return std::move(Err);
2555 Name.getAsIdentifierInfo()))
2558 Error Err = Error::success();
2563 return std::move(Err);
2567 addDeclToContexts(
D, ToD);
2575 return LocOrErr.takeError();
2576 auto ColonLocOrErr =
import(
D->getColonLoc());
2578 return ColonLocOrErr.takeError();
2583 return DCOrErr.takeError();
2588 DC, *LocOrErr, *ColonLocOrErr))
2602 return DCOrErr.takeError();
2606 Error Err = Error::success();
2612 return std::move(Err);
2615 if (GetImportedOrCreateDecl(
2616 ToD,
D, Importer.
getToContext(), DC, ToLocation, ToAssertExpr, ToMessage,
2617 ToRParenLoc,
D->isFailed()))
2632 return std::move(Err);
2641 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
2647 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2648 for (
auto *FoundDecl : FoundDecls) {
2652 if (
auto *FoundNS = dyn_cast<NamespaceDecl>(FoundDecl)) {
2653 MergeWithNamespace = FoundNS;
2654 ConflictingDecls.clear();
2658 ConflictingDecls.push_back(FoundDecl);
2661 if (!ConflictingDecls.empty()) {
2664 ConflictingDecls.size());
2666 Name = NameOrErr.get();
2668 return NameOrErr.takeError();
2674 return BeginLocOrErr.takeError();
2676 if (!RBraceLocOrErr)
2677 return RBraceLocOrErr.takeError();
2682 if (GetImportedOrCreateDecl(ToNamespace,
D, Importer.
getToContext(), DC,
2683 D->isInline(), *BeginLocOrErr,
Loc,
2684 Name.getAsIdentifierInfo(),
2685 nullptr,
D->isNested()))
2694 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
2695 TU->setAnonymousNamespace(ToNamespace);
2697 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2703 return std::move(Err);
2715 return std::move(Err);
2721 Error Err = Error::success();
2725 auto ToTargetNameLoc =
importChecked(Err,
D->getTargetNameLoc());
2728 return std::move(Err);
2733 if (GetImportedOrCreateDecl(
2734 ToD,
D, Importer.
getToContext(), DC, ToNamespaceLoc, ToAliasLoc,
2735 ToIdentifier, ToQualifierLoc, ToTargetNameLoc, ToNamespace))
2753 return std::move(Err);
2772 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2773 for (
auto *FoundDecl : FoundDecls) {
2776 if (
auto *FoundTypedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
2780 QualType FromUT =
D->getUnderlyingType();
2781 QualType FoundUT = FoundTypedef->getUnderlyingType();
2795 if (FromR && FoundR &&
2806 ConflictingDecls.push_back(FoundDecl);
2811 if (!ConflictingDecls.empty()) {
2813 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
2815 Name = NameOrErr.get();
2817 return NameOrErr.takeError();
2821 Error Err = Error::success();
2823 auto ToTypeSourceInfo =
importChecked(Err,
D->getTypeSourceInfo());
2826 return std::move(Err);
2833 if (GetImportedOrCreateDecl<TypeAliasDecl>(
2835 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
2837 }
else if (GetImportedOrCreateDecl<TypedefDecl>(
2839 Name.getAsIdentifierInfo(), ToTypeSourceInfo))
2844 return std::move(Err);
2848 Importer.AddToLookupTable(ToTypedef);
2853 TypeAliasDecl *FromAlias = IsAlias ? cast<TypeAliasDecl>(
D) :
nullptr;
2876 return std::move(Err);
2886 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
2887 for (
auto *FoundDecl : FoundDecls) {
2890 if (
auto *FoundAlias = dyn_cast<TypeAliasTemplateDecl>(FoundDecl)) {
2893 ConflictingDecls.push_back(FoundDecl);
2897 if (!ConflictingDecls.empty()) {
2899 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
2901 Name = NameOrErr.get();
2903 return NameOrErr.takeError();
2907 Error Err = Error::success();
2908 auto ToTemplateParameters =
importChecked(Err,
D->getTemplateParameters());
2909 auto ToTemplatedDecl =
importChecked(Err,
D->getTemplatedDecl());
2911 return std::move(Err);
2915 Name, ToTemplateParameters, ToTemplatedDecl))
2918 ToTemplatedDecl->setDescribedAliasTemplate(ToAlias);
2924 updateLookupTableForTemplateParameters(*ToTemplateParameters);
2935 return std::move(Err);
2942 if (
D->isGnuLocal()) {
2945 return BeginLocOrErr.takeError();
2947 Name.getAsIdentifierInfo(), *BeginLocOrErr))
2952 Name.getAsIdentifierInfo()))
2959 return ToStmtOrErr.takeError();
2961 ToLabel->
setStmt(*ToStmtOrErr);
2974 return std::move(Err);
2981 if (!SearchName &&
D->getTypedefNameForAnonDecl()) {
2982 if (Error Err = importInto(
2983 SearchName,
D->getTypedefNameForAnonDecl()->getDeclName()))
2984 return std::move(Err);
2994 Importer.findDeclsInToCtx(DC, SearchName);
2995 for (
auto *FoundDecl : FoundDecls) {
2999 if (
auto *Typedef = dyn_cast<TypedefNameDecl>(FoundDecl)) {
3000 if (
const auto *Tag = Typedef->getUnderlyingType()->getAs<
TagType>())
3001 FoundDecl = Tag->getDecl();
3004 if (
auto *FoundEnum = dyn_cast<EnumDecl>(FoundDecl)) {
3009 if (
D->isThisDeclarationADefinition() && FoundDef)
3014 ConflictingDecls.push_back(FoundDecl);
3023 if (SearchName && !ConflictingDecls.empty()) {
3025 SearchName, DC, IDNS, ConflictingDecls.data(),
3026 ConflictingDecls.size());
3028 Name = NameOrErr.get();
3030 return NameOrErr.takeError();
3034 Error Err = Error::success();
3040 return std::move(Err);
3044 if (GetImportedOrCreateDecl(
3046 Loc, Name.getAsIdentifierInfo(), PrevDecl,
D->isScoped(),
3047 D->isScopedUsingClassTag(),
D->isFixed()))
3055 addDeclToContexts(
D, D2);
3059 EnumDecl *FromInst =
D->getInstantiatedFromMemberEnum();
3061 D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK);
3063 return ToInstOrErr.takeError();
3064 if (
ExpectedSLoc POIOrErr =
import(MemberInfo->getPointOfInstantiation()))
3067 return POIOrErr.takeError();
3071 if (
D->isCompleteDefinition())
3073 return std::move(Err);
3079 bool IsFriendTemplate =
false;
3080 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(
D)) {
3082 DCXX->getDescribedClassTemplate() &&
3083 DCXX->getDescribedClassTemplate()->getFriendObjectKind() !=
3093 return std::move(Err);
3100 if (!SearchName &&
D->getTypedefNameForAnonDecl()) {
3101 if (Error Err = importInto(
3102 SearchName,
D->getTypedefNameForAnonDecl()->getDeclName()))
3103 return std::move(Err);
3110 bool DependentFriend = IsFriendTemplate && IsDependentContext;
3117 Importer.findDeclsInToCtx(DC, SearchName);
3118 if (!FoundDecls.empty()) {
3121 if (
D->hasExternalLexicalStorage() && !
D->isCompleteDefinition())
3125 for (
auto *FoundDecl : FoundDecls) {
3130 if (
auto *Typedef = dyn_cast<TypedefNameDecl>(
Found)) {
3131 if (
const auto *Tag = Typedef->getUnderlyingType()->getAs<
TagType>())
3132 Found = Tag->getDecl();
3135 if (
auto *FoundRecord = dyn_cast<RecordDecl>(
Found)) {
3154 if (
D->isThisDeclarationADefinition() && FoundDef) {
3158 if (
const auto *DCXX = dyn_cast<CXXRecordDecl>(
D)) {
3159 auto *FoundCXX = dyn_cast<CXXRecordDecl>(FoundDef);
3160 assert(FoundCXX &&
"Record type mismatch");
3166 return std::move(Err);
3172 ConflictingDecls.push_back(FoundDecl);
3176 if (!ConflictingDecls.empty() && SearchName) {
3178 SearchName, DC, IDNS, ConflictingDecls.data(),
3179 ConflictingDecls.size());
3181 Name = NameOrErr.get();
3183 return NameOrErr.takeError();
3189 return BeginLocOrErr.takeError();
3194 if (
auto *DCXX = dyn_cast<CXXRecordDecl>(
D)) {
3195 if (DCXX->isLambda()) {
3196 auto TInfoOrErr =
import(DCXX->getLambdaTypeInfo());
3198 return TInfoOrErr.takeError();
3199 if (GetImportedOrCreateSpecialDecl(
3201 DC, *TInfoOrErr,
Loc, DCXX->getLambdaDependencyKind(),
3202 DCXX->isGenericLambda(), DCXX->getLambdaCaptureDefault()))
3207 return CDeclOrErr.takeError();
3210 }
else if (DCXX->isInjectedClassName()) {
3213 const bool DelayTypeCreation =
true;
3214 if (GetImportedOrCreateDecl(
3216 *BeginLocOrErr,
Loc, Name.getAsIdentifierInfo(),
3217 cast_or_null<CXXRecordDecl>(PrevDecl), DelayTypeCreation))
3220 D2CXX, dyn_cast<CXXRecordDecl>(DC));
3222 if (GetImportedOrCreateDecl(D2CXX,
D, Importer.
getToContext(),
3223 D->getTagKind(), DC, *BeginLocOrErr,
Loc,
3224 Name.getAsIdentifierInfo(),
3225 cast_or_null<CXXRecordDecl>(PrevDecl)))
3232 addDeclToContexts(
D, D2);
3235 DCXX->getDescribedClassTemplate()) {
3237 if (Error Err = importInto(ToDescribed, FromDescribed))
3238 return std::move(Err);
3240 if (!DCXX->isInjectedClassName() && !IsFriendTemplate) {
3260 const Type *FrontTy =
3261 cast<CXXRecordDecl>(Redecls.front())->getTypeForDecl();
3264 InjSpec = InjTy->getInjectedSpecializationType();
3267 for (
auto *R : Redecls) {
3268 auto *RI = cast<CXXRecordDecl>(R);
3269 if (R != Redecls.front() ||
3270 !isa<InjectedClassNameType>(RI->getTypeForDecl()))
3271 RI->setTypeForDecl(
nullptr);
3286 DCXX->getMemberSpecializationInfo()) {
3288 MemberInfo->getTemplateSpecializationKind();
3294 return ToInstOrErr.takeError();
3297 import(MemberInfo->getPointOfInstantiation()))
3301 return POIOrErr.takeError();
3306 D->getTagKind(), DC, *BeginLocOrErr,
Loc,
3307 Name.getAsIdentifierInfo(), PrevDecl))
3310 addDeclToContexts(
D, D2);
3313 if (
auto BraceRangeOrErr =
import(
D->getBraceRange()))
3316 return BraceRangeOrErr.takeError();
3317 if (
auto QualifierLocOrErr =
import(
D->getQualifierLoc()))
3320 return QualifierLocOrErr.takeError();
3322 if (
D->isAnonymousStructOrUnion())
3325 if (
D->isCompleteDefinition())
3327 return std::move(Err);
3339 return std::move(Err);
3348 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3349 for (
auto *FoundDecl : FoundDecls) {
3353 if (
auto *FoundEnumConstant = dyn_cast<EnumConstantDecl>(FoundDecl)) {
3356 ConflictingDecls.push_back(FoundDecl);
3360 if (!ConflictingDecls.empty()) {
3362 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3364 Name = NameOrErr.get();
3366 return NameOrErr.takeError();
3372 return TypeOrErr.takeError();
3376 return InitOrErr.takeError();
3379 if (GetImportedOrCreateDecl(
3381 Name.getAsIdentifierInfo(), *TypeOrErr, *InitOrErr,
D->getInitVal()))
3382 return ToEnumerator;
3387 return ToEnumerator;
3390template <
typename DeclTy>
3393 unsigned int Num = FromD->getNumTemplateParameterLists();
3395 return Error::success();
3397 for (
unsigned int I = 0; I <
Num; ++I)
3399 import(FromD->getTemplateParameterList(I)))
3400 ToTPLists[I] = *ToTPListOrErr;
3402 return ToTPListOrErr.takeError();
3403 ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists);
3404 return Error::success();
3412 return Error::success();
3418 return Error::success();
3424 ToFD->setInstantiationOfMemberFunction(*InstFDOrErr, TSK);
3426 return InstFDOrErr.takeError();
3432 return POIOrErr.takeError();
3434 return Error::success();
3438 auto FunctionAndArgsOrErr =
3440 if (!FunctionAndArgsOrErr)
3441 return FunctionAndArgsOrErr.takeError();
3444 Importer.
getToContext(), std::get<1>(*FunctionAndArgsOrErr));
3448 const auto *FromTAArgsAsWritten = FTSInfo->TemplateArgumentsAsWritten;
3449 if (FromTAArgsAsWritten)
3451 *FromTAArgsAsWritten, ToTAInfo))
3454 ExpectedSLoc POIOrErr =
import(FTSInfo->getPointOfInstantiation());
3456 return POIOrErr.takeError();
3462 ToFD->setFunctionTemplateSpecialization(
3463 std::get<0>(*FunctionAndArgsOrErr), ToTAList,
nullptr,
3464 TSK, FromTAArgsAsWritten ? &ToTAInfo :
nullptr, *POIOrErr);
3465 return Error::success();
3473 Candidates.
addDecl(*ToFTDOrErr);
3475 return ToFTDOrErr.takeError();
3480 const auto *FromTAArgsAsWritten = FromInfo->TemplateArgumentsAsWritten;
3481 if (FromTAArgsAsWritten)
3488 FromTAArgsAsWritten ? &ToTAInfo :
nullptr);
3489 return Error::success();
3492 llvm_unreachable(
"All cases should be covered!");
3497 auto FunctionAndArgsOrErr =
3499 if (!FunctionAndArgsOrErr)
3500 return FunctionAndArgsOrErr.takeError();
3504 std::tie(Template, ToTemplArgs) = *FunctionAndArgsOrErr;
3505 void *InsertPos =
nullptr;
3516 return ToBodyOrErr.takeError();
3518 return Error::success();
3527 assert(DCi &&
"Declaration should have a context");
3541 ToProcess.push_back(S);
3542 while (!ToProcess.empty()) {
3543 const Stmt *CurrentS = ToProcess.pop_back_val();
3545 if (
const auto *DeclRef = dyn_cast<DeclRefExpr>(CurrentS)) {
3546 if (
const Decl *
D = DeclRef->getDecl())
3549 }
else if (
const auto *
E =
3550 dyn_cast_or_null<SubstNonTypeTemplateParmExpr>(CurrentS)) {
3551 if (
const Decl *
D =
E->getAssociatedDecl())
3584class IsTypeDeclaredInsideVisitor
3585 :
public TypeVisitor<IsTypeDeclaredInsideVisitor, std::optional<bool>> {
3587 IsTypeDeclaredInsideVisitor(
const FunctionDecl *ParentDC)
3588 : ParentDC(ParentDC) {}
3594 if (std::optional<bool> Res = Visit(
T.getTypePtr()))
3597 T.getSingleStepDesugaredType(ParentDC->getParentASTContext());
3599 if (std::optional<bool> Res = Visit(DsT.
getTypePtr()))
3602 DsT =
T.getSingleStepDesugaredType(ParentDC->getParentASTContext());
3607 std::optional<bool> VisitTagType(
const TagType *
T) {
3608 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
T->getDecl()))
3609 for (
const auto &Arg : Spec->getTemplateArgs().asArray())
3610 if (checkTemplateArgument(Arg))
3615 std::optional<bool> VisitPointerType(
const PointerType *
T) {
3620 return CheckType(
T->getPointeeTypeAsWritten());
3623 std::optional<bool> VisitTypedefType(
const TypedefType *
T) {
3629 std::optional<bool> VisitUsingType(
const UsingType *
T) {
3630 if (
T->getFoundDecl() &&
3639 for (
const auto &Arg :
T->template_arguments())
3640 if (checkTemplateArgument(Arg))
3647 return CheckType(
T->getBaseType());
3662 return CheckType(
T->getElementType());
3667 "Variable array should not occur in deduced return type of a function");
3671 llvm_unreachable(
"Incomplete array should not occur in deduced return type "
3676 llvm_unreachable(
"Dependent array should not occur in deduced return type "
3703 if (checkTemplateArgument(PackArg))
3715 llvm_unreachable(
"Unknown TemplateArgument::ArgKind enum");
3725 assert(FromFPT &&
"Must be called on FunctionProtoType");
3727 auto IsCXX11Lambda = [&]() {
3728 if (Importer.FromContext.
getLangOpts().CPlusPlus14)
3731 if (
const auto *MD = dyn_cast<CXXMethodDecl>(
D))
3732 return cast<CXXRecordDecl>(MD->getDeclContext())->isLambda();
3737 QualType RetT = FromFPT->getReturnType();
3738 if (isa<AutoType>(RetT.
getTypePtr()) || IsCXX11Lambda()) {
3740 IsTypeDeclaredInsideVisitor Visitor(Def ? Def :
D);
3741 return Visitor.CheckType(RetT);
3758 auto RedeclIt = Redecls.begin();
3761 for (; RedeclIt != Redecls.end() && *RedeclIt !=
D; ++RedeclIt) {
3764 return ToRedeclOrErr.takeError();
3766 assert(*RedeclIt ==
D);
3774 return std::move(Err);
3786 if (
D->getTemplatedKind() ==
3789 if (!FoundFunctionOrErr)
3790 return FoundFunctionOrErr.takeError();
3791 if (
FunctionDecl *FoundFunction = *FoundFunctionOrErr) {
3792 if (
Decl *Def = FindAndMapDefinition(
D, FoundFunction))
3794 FoundByLookup = FoundFunction;
3802 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
3803 for (
auto *FoundDecl : FoundDecls) {
3807 if (
auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) {
3812 if (
Decl *Def = FindAndMapDefinition(
D, FoundFunction))
3814 FoundByLookup = FoundFunction;
3825 Importer.
ToDiag(
Loc, diag::warn_odr_function_type_inconsistent)
3826 << Name <<
D->getType() << FoundFunction->getType();
3827 Importer.
ToDiag(FoundFunction->getLocation(), diag::note_odr_value_here)
3828 << FoundFunction->getType();
3829 ConflictingDecls.push_back(FoundDecl);
3833 if (!ConflictingDecls.empty()) {
3835 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
3837 Name = NameOrErr.get();
3839 return NameOrErr.takeError();
3849 if (FoundByLookup) {
3850 if (isa<CXXMethodDecl>(FoundByLookup)) {
3852 if (!
D->doesThisDeclarationHaveABody()) {
3854 D->getDescribedFunctionTemplate()) {
3859 "Templated function mapped to non-templated?");
3875 return std::move(Err);
3886 bool UsedDifferentProtoType =
false;
3888 QualType FromReturnTy = FromFPT->getReturnType();
3896 UsedDifferentProtoType =
true;
3907 FromEPI = DefaultEPI;
3908 UsedDifferentProtoType =
true;
3911 FromReturnTy, FromFPT->getParamTypes(), FromEPI);
3916 Error Err = Error::success();
3919 auto ToInnerLocStart =
importChecked(Err,
D->getInnerLocStart());
3923 auto TrailingRequiresClause =
3926 return std::move(Err);
3930 for (
auto *
P :
D->parameters()) {
3932 Parameters.push_back(*ToPOrErr);
3934 return ToPOrErr.takeError();
3939 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(
D)) {
3941 importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier());
3943 return std::move(Err);
3945 if (FromConstructor->isInheritingConstructor()) {
3947 import(FromConstructor->getInheritedConstructor());
3948 if (!ImportedInheritedCtor)
3949 return ImportedInheritedCtor.takeError();
3950 ToInheritedConstructor = *ImportedInheritedCtor;
3952 if (GetImportedOrCreateDecl<CXXConstructorDecl>(
3953 ToFunction,
D, Importer.
getToContext(), cast<CXXRecordDecl>(DC),
3954 ToInnerLocStart, NameInfo,
T, TInfo, ESpec,
D->UsesFPIntrin(),
3955 D->isInlineSpecified(),
D->
isImplicit(),
D->getConstexprKind(),
3956 ToInheritedConstructor, TrailingRequiresClause))
3960 Error Err = Error::success();
3962 Err,
const_cast<FunctionDecl *
>(FromDtor->getOperatorDelete()));
3963 auto ToThisArg =
importChecked(Err, FromDtor->getOperatorDeleteThisArg());
3965 return std::move(Err);
3967 if (GetImportedOrCreateDecl<CXXDestructorDecl>(
3968 ToFunction,
D, Importer.
getToContext(), cast<CXXRecordDecl>(DC),
3969 ToInnerLocStart, NameInfo,
T, TInfo,
D->UsesFPIntrin(),
3970 D->isInlineSpecified(),
D->
isImplicit(),
D->getConstexprKind(),
3971 TrailingRequiresClause))
3978 dyn_cast<CXXConversionDecl>(
D)) {
3980 importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier());
3982 return std::move(Err);
3983 if (GetImportedOrCreateDecl<CXXConversionDecl>(
3984 ToFunction,
D, Importer.
getToContext(), cast<CXXRecordDecl>(DC),
3985 ToInnerLocStart, NameInfo,
T, TInfo,
D->UsesFPIntrin(),
3986 D->isInlineSpecified(), ESpec,
D->getConstexprKind(),
3989 }
else if (
auto *Method = dyn_cast<CXXMethodDecl>(
D)) {
3990 if (GetImportedOrCreateDecl<CXXMethodDecl>(
3991 ToFunction,
D, Importer.
getToContext(), cast<CXXRecordDecl>(DC),
3992 ToInnerLocStart, NameInfo,
T, TInfo, Method->getStorageClass(),
3993 Method->UsesFPIntrin(), Method->isInlineSpecified(),
3996 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(
D)) {
3998 importExplicitSpecifier(Err, Guide->getExplicitSpecifier());
4002 return std::move(Err);
4003 if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>(
4004 ToFunction,
D, Importer.
getToContext(), DC, ToInnerLocStart, ESpec,
4005 NameInfo,
T, TInfo, ToEndLoc, Ctor))
4007 cast<CXXDeductionGuideDecl>(ToFunction)
4008 ->setDeductionCandidateKind(Guide->getDeductionCandidateKind());
4010 if (GetImportedOrCreateDecl(
4011 ToFunction,
D, Importer.
getToContext(), DC, ToInnerLocStart,
4012 NameInfo,
T, TInfo,
D->getStorageClass(),
D->UsesFPIntrin(),
4013 D->isInlineSpecified(),
D->hasWrittenPrototype(),
4014 D->getConstexprKind(), TrailingRequiresClause))
4019 if (FoundByLookup) {
4032 auto Imported =
import(Msg);
4034 return Imported.takeError();
4048 D->FriendConstraintRefersToEnclosingTemplate());
4058 for (
auto *Param : Parameters) {
4059 Param->setOwningFunction(ToFunction);
4064 ToFunction->setParams(Parameters);
4071 for (
unsigned I = 0, N = Parameters.size(); I != N; ++I)
4072 ProtoLoc.setParam(I, Parameters[I]);
4078 auto ToFTOrErr =
import(FromFT);
4080 return ToFTOrErr.takeError();
4084 if (
auto *FromConstructor = dyn_cast<CXXConstructorDecl>(
D)) {
4085 if (
unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
4089 FromConstructor->inits(), CtorInitializers))
4090 return std::move(Err);
4093 std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory);
4094 auto *ToCtor = cast<CXXConstructorDecl>(ToFunction);
4095 ToCtor->setCtorInitializers(Memory);
4096 ToCtor->setNumCtorInitializers(NumInitializers);
4102 return std::move(Err);
4104 if (
auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(
D))
4107 return std::move(Err);
4109 if (
D->doesThisDeclarationHaveABody()) {
4113 return std::move(Err);
4117 if (UsedDifferentProtoType) {
4119 ToFunction->
setType(*TyOrErr);
4121 return TyOrErr.takeError();
4125 return TSIOrErr.takeError();
4130 addDeclToContexts(
D, ToFunction);
4133 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4136 return ToRedeclOrErr.takeError();
4170 return std::move(Err);
4175 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4176 for (
auto *FoundDecl : FoundDecls) {
4177 if (
FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecl)) {
4185 FoundField->getType())) {
4193 if (
Expr *FromInitializer =
D->getInClassInitializer()) {
4194 if (
ExpectedExpr ToInitializerOrErr =
import(FromInitializer)) {
4197 assert(FoundField->hasInClassInitializer() &&
4198 "Field should have an in-class initializer if it has an "
4199 "expression for it.");
4200 if (!FoundField->getInClassInitializer())
4201 FoundField->setInClassInitializer(*ToInitializerOrErr);
4203 return ToInitializerOrErr.takeError();
4210 Importer.
ToDiag(
Loc, diag::warn_odr_field_type_inconsistent)
4211 << Name <<
D->getType() << FoundField->getType();
4212 Importer.
ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4213 << FoundField->getType();
4219 Error Err = Error::success();
4223 auto ToInnerLocStart =
importChecked(Err,
D->getInnerLocStart());
4225 return std::move(Err);
4226 const Type *ToCapturedVLAType =
nullptr;
4228 ToCapturedVLAType, cast_or_null<Type>(
D->getCapturedVLAType())))
4229 return std::move(Err);
4232 if (GetImportedOrCreateDecl(ToField,
D, Importer.
getToContext(), DC,
4233 ToInnerLocStart,
Loc, Name.getAsIdentifierInfo(),
4234 ToType, ToTInfo, ToBitWidth,
D->isMutable(),
4235 D->getInClassInitStyle()))
4241 if (ToCapturedVLAType)
4246 auto ToInitializer =
importChecked(Err,
D->getInClassInitializer());
4248 return std::move(Err);
4249 if (ToInitializer) {
4251 if (AlreadyImported)
4252 assert(ToInitializer == AlreadyImported &&
4253 "Duplicate import of in-class initializer.");
4268 return std::move(Err);
4273 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4274 for (
unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4275 if (
auto *FoundField = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
4283 FoundField->getType(),
4290 if (!Name && I < N-1)
4294 Importer.
ToDiag(
Loc, diag::warn_odr_field_type_inconsistent)
4295 << Name <<
D->getType() << FoundField->getType();
4296 Importer.
ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
4297 << FoundField->getType();
4304 auto TypeOrErr =
import(
D->getType());
4306 return TypeOrErr.takeError();
4312 for (
auto *PI :
D->chain())
4314 NamedChain[i++] = *ToD;
4316 return ToD.takeError();
4320 if (GetImportedOrCreateDecl(ToIndirectField,
D, Importer.
getToContext(), DC,
4321 Loc, Name.getAsIdentifierInfo(), *TypeOrErr, CH))
4323 return ToIndirectField;
4328 return ToIndirectField;
4358 unsigned int FriendCount = 0;
4359 std::optional<unsigned int> FriendPosition;
4362 for (
FriendDecl *FoundFriend : RD->friends()) {
4363 if (FoundFriend == FD) {
4364 FriendPosition = FriendCount;
4371 assert(FriendPosition &&
"Friend decl not found in own parent.");
4373 return {FriendCount, *FriendPosition};
4380 return std::move(Err);
4385 const auto *RD = cast<CXXRecordDecl>(DC);
4387 for (
FriendDecl *ImportedFriend : RD->friends())
4389 ImportedEquivalentFriends.push_back(ImportedFriend);
4394 assert(ImportedEquivalentFriends.size() <= CountAndPosition.
TotalCount &&
4395 "Class with non-matching friends is imported, ODR check wrong?");
4396 if (ImportedEquivalentFriends.size() == CountAndPosition.
TotalCount)
4398 D, ImportedEquivalentFriends[CountAndPosition.
IndexOfDecl]);
4403 if (
NamedDecl *FriendD =
D->getFriendDecl()) {
4405 if (Error Err = importInto(ToFriendD, FriendD))
4406 return std::move(Err);
4414 if (
auto TSIOrErr =
import(
D->getFriendType()))
4417 return TSIOrErr.takeError();
4422 for (
unsigned I = 0; I <
D->NumTPLists; I++) {
4423 if (
auto ListOrErr =
import(FromTPLists[I]))
4424 ToTPLists[I] = *ListOrErr;
4426 return ListOrErr.takeError();
4431 return LocationOrErr.takeError();
4432 auto FriendLocOrErr =
import(
D->getFriendLoc());
4433 if (!FriendLocOrErr)
4434 return FriendLocOrErr.takeError();
4435 auto EllipsisLocOrErr =
import(
D->getEllipsisLoc());
4436 if (!EllipsisLocOrErr)
4437 return EllipsisLocOrErr.takeError();
4440 if (GetImportedOrCreateDecl(FrD,
D, Importer.
getToContext(), DC,
4441 *LocationOrErr, ToFU, *FriendLocOrErr,
4442 *EllipsisLocOrErr, ToTPLists))
4458 return std::move(Err);
4463 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4464 for (
auto *FoundDecl : FoundDecls) {
4465 if (
ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecl)) {
4467 FoundIvar->getType())) {
4472 Importer.
ToDiag(
Loc, diag::warn_odr_ivar_type_inconsistent)
4473 << Name <<
D->getType() << FoundIvar->getType();
4474 Importer.
ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
4475 << FoundIvar->getType();
4481 Error Err = Error::success();
4483 auto ToTypeSourceInfo =
importChecked(Err,
D->getTypeSourceInfo());
4485 auto ToInnerLocStart =
importChecked(Err,
D->getInnerLocStart());
4487 return std::move(Err);
4490 if (GetImportedOrCreateDecl(
4491 ToIvar,
D, Importer.
getToContext(), cast<ObjCContainerDecl>(DC),
4492 ToInnerLocStart,
Loc, Name.getAsIdentifierInfo(),
4493 ToType, ToTypeSourceInfo,
4494 D->getAccessControl(),ToBitWidth,
D->getSynthesize()))
4505 auto RedeclIt = Redecls.begin();
4508 for (; RedeclIt != Redecls.end() && *RedeclIt !=
D; ++RedeclIt) {
4511 return RedeclOrErr.takeError();
4513 assert(*RedeclIt ==
D);
4521 return std::move(Err);
4527 VarDecl *FoundByLookup =
nullptr;
4528 if (
D->isFileVarDecl()) {
4531 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4532 for (
auto *FoundDecl : FoundDecls) {
4536 if (
auto *FoundVar = dyn_cast<VarDecl>(FoundDecl)) {
4540 FoundVar->getType())) {
4545 if (
D->isThisDeclarationADefinition() && FoundDef)
4552 const VarDecl *FoundDInit =
nullptr;
4553 if (
D->getInit() && FoundVar->getAnyInitializer(FoundDInit))
4557 FoundByLookup = FoundVar;
4565 if (FoundArray && TArray) {
4566 if (isa<IncompleteArrayType>(FoundArray) &&
4567 isa<ConstantArrayType>(TArray)) {
4569 if (
auto TyOrErr =
import(
D->getType()))
4570 FoundVar->setType(*TyOrErr);
4572 return TyOrErr.takeError();
4574 FoundByLookup = FoundVar;
4576 }
else if (isa<IncompleteArrayType>(TArray) &&
4577 isa<ConstantArrayType>(FoundArray)) {
4578 FoundByLookup = FoundVar;
4583 Importer.
ToDiag(
Loc, diag::warn_odr_variable_type_inconsistent)
4584 << Name <<
D->getType() << FoundVar->getType();
4585 Importer.
ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
4586 << FoundVar->getType();
4587 ConflictingDecls.push_back(FoundDecl);
4591 if (!ConflictingDecls.empty()) {
4593 Name, DC, IDNS, ConflictingDecls.data(), ConflictingDecls.size());
4595 Name = NameOrErr.get();
4597 return NameOrErr.takeError();
4601 Error Err = Error::success();
4603 auto ToTypeSourceInfo =
importChecked(Err,
D->getTypeSourceInfo());
4604 auto ToInnerLocStart =
importChecked(Err,
D->getInnerLocStart());
4607 return std::move(Err);
4610 if (
auto *FromDecomp = dyn_cast<DecompositionDecl>(
D)) {
4614 return std::move(Err);
4616 if (GetImportedOrCreateDecl(
4617 ToDecomp, FromDecomp, Importer.
getToContext(), DC, ToInnerLocStart,
4618 Loc, ToType, ToTypeSourceInfo,
D->getStorageClass(),
Bindings))
4623 if (GetImportedOrCreateDecl(ToVar,
D, Importer.
getToContext(), DC,
4624 ToInnerLocStart,
Loc,
4625 Name.getAsIdentifierInfo(), ToType,
4626 ToTypeSourceInfo,
D->getStorageClass()))
4634 if (
D->isInlineSpecified())
4639 if (FoundByLookup) {
4645 if (
D->getDescribedVarTemplate()) {
4646 auto ToVTOrErr =
import(
D->getDescribedVarTemplate());
4648 return ToVTOrErr.takeError();
4651 VarDecl *FromInst =
D->getInstantiatedFromStaticDataMember();
4655 return ToInstOrErr.takeError();
4656 if (
ExpectedSLoc POIOrErr =
import(MSI->getPointOfInstantiation()))
4659 return POIOrErr.takeError();
4663 return std::move(Err);
4665 if (
D->isConstexpr())
4668 addDeclToContexts(
D, ToVar);
4671 for (++RedeclIt; RedeclIt != Redecls.end(); ++RedeclIt) {
4674 return RedeclOrErr.takeError();
4685 Error Err = Error::success();
4690 return std::move(Err);
4694 if (GetImportedOrCreateDecl(ToParm,
D, Importer.
getToContext(), DC,
4695 ToLocation, ToDeclName.getAsIdentifierInfo(),
4696 ToType,
D->getParameterKind()))
4712 return ToDefArgOrErr.takeError();
4716 if (
auto ToDefArgOrErr =
import(FromParam->
getDefaultArg()))
4719 return ToDefArgOrErr.takeError();
4722 return Error::success();
4727 Error Err = Error::success();
4732 return std::move(Err);
4741 Error Err = Error::success();
4744 auto ToInnerLocStart =
importChecked(Err,
D->getInnerLocStart());
4746 auto ToTypeSourceInfo =
importChecked(Err,
D->getTypeSourceInfo());
4748 return std::move(Err);
4751 if (GetImportedOrCreateDecl(ToParm,
D, Importer.
getToContext(), DC,
4752 ToInnerLocStart, ToLocation,
4753 ToDeclName.getAsIdentifierInfo(), ToType,
4754 ToTypeSourceInfo,
D->getStorageClass(),
4762 return std::move(Err);
4764 if (
D->isObjCMethodParameter()) {
4769 D->getFunctionScopeIndex());
4782 return std::move(Err);
4786 auto FoundDecls = Importer.findDeclsInToCtx(DC, Name);
4787 for (
auto *FoundDecl : FoundDecls) {
4788 if (
auto *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecl)) {
4789 if (FoundMethod->isInstanceMethod() !=
D->isInstanceMethod())
4794 FoundMethod->getReturnType())) {
4795 Importer.
ToDiag(
Loc, diag::warn_odr_objc_method_result_type_inconsistent)
4796 <<
D->isInstanceMethod() << Name <<
D->getReturnType()