diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 8cb45080..bd1debdd 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2562,16 +2562,8 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, auto UTT = new UnaryTransformType(); auto Loc = TL->getAs<UnaryTransformTypeLoc>().getUnderlyingTInfo()->getTypeLoc(); - if (UT->isSugared()) - { - UTT->Desugared = GetQualifiedType(UT->desugar(), &Loc); - UTT->BaseType = GetQualifiedType(UT->getBaseType(), &Loc); - } - else - { - UTT->Desugared = GetQualifiedType(UT->getBaseType(), &Loc); - UTT->BaseType = GetQualifiedType(UT->getBaseType(), &Loc); - } + UTT->Desugared = GetQualifiedType(UT->isSugared() ? UT->desugar() : UT->getBaseType(), &Loc); + UTT->BaseType = GetQualifiedType(UT->getBaseType(), &Loc); Ty = UTT; break; @@ -2733,6 +2725,27 @@ bool Parser::CanCheckCodeGenInfo(clang::Sema& S, const clang::Type* Ty) return true; } +static clang::TypeLoc DesugarTypeLoc(const clang::TypeLoc& Loc) +{ + using namespace clang; + + switch (Loc.getTypeLocClass()) + { + case TypeLoc::TypeLocClass::Attributed: + { + auto ATL = Loc.getAs<AttributedTypeLoc>(); + return ATL.getModifiedLoc(); + } + case TypeLoc::TypeLocClass::Paren: + { + auto PTL = Loc.getAs<ParenTypeLoc>(); + return PTL.getInnerLoc(); + } + } + + return Loc; +} + void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F, bool IsDependent) { @@ -2762,22 +2775,7 @@ void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F, TypeLoc RTL; if (auto TSI = FD->getTypeSourceInfo()) { - auto Loc = TSI->getTypeLoc(); - switch (Loc.getTypeLocClass()) - { - case TypeLoc::TypeLocClass::Attributed: - { - auto ATL = Loc.getAs<AttributedTypeLoc>(); - Loc = ATL.getModifiedLoc(); - break; - } - case TypeLoc::TypeLocClass::Paren: - { - auto PTL = Loc.getAs<ParenTypeLoc>(); - Loc = PTL.getInnerLoc(); - break; - } - } + auto Loc = DesugarTypeLoc(TSI->getTypeLoc()); auto FTL = Loc.getAs<FunctionTypeLoc>(); if (FTL) { diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 34eb01c3..0b0f020c 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -224,6 +224,7 @@ namespace CppSharp.Generators.CLI case PrimitiveType.IntPtr: return "IntPtr"; case PrimitiveType.UIntPtr: return "UIntPtr"; case PrimitiveType.Null: return "void*"; + case PrimitiveType.Int128: return "__int128"; } throw new NotSupportedException(); @@ -269,7 +270,7 @@ namespace CppSharp.Generators.CLI return string.Empty; TypeMap typeMap = null; - if (TypeMapDatabase.FindTypeMap(template, out typeMap)) + if (TypeMapDatabase.FindTypeMap(template, out typeMap) && !typeMap.IsIgnored) { typeMap.Declaration = decl; typeMap.Type = template; diff --git a/src/Generator/Types/Std/Stdlib.cs b/src/Generator/Types/Std/Stdlib.cs index 776055c0..11dc2eb1 100644 --- a/src/Generator/Types/Std/Stdlib.cs +++ b/src/Generator/Types/Std/Stdlib.cs @@ -164,11 +164,15 @@ namespace CppSharp.Types.Std { get { - var type = Type as TemplateSpecializationType; - var pointeeType = type.Arguments[0].Type; - + var finalType = Type.GetFinalPointee() ?? Type; + var type = finalType as TemplateSpecializationType; + if (type == null) + { + var injectedClassNameType = (InjectedClassNameType) finalType; + type = (TemplateSpecializationType) injectedClassNameType.InjectedSpecializationType.Type; + } var checker = new TypeIgnoreChecker(TypeMapDatabase); - pointeeType.Visit(checker); + type.Arguments[0].Type.Visit(checker); return checker.IsIgnored; }