diff --git a/src/AST/Function.cs b/src/AST/Function.cs index fc01d9b8..8dcaebcc 100644 --- a/src/AST/Function.cs +++ b/src/AST/Function.cs @@ -115,6 +115,7 @@ namespace CppSharp.AST Parameters = new List(); ReturnType = function.ReturnType; IsReturnIndirect = function.IsReturnIndirect; + HasThisReturn = function.HasThisReturn; Parameters.AddRange(function.Parameters.Select(p => new Parameter(p))); IsVariadic = function.IsVariadic; IsInline = function.IsInline; @@ -134,6 +135,7 @@ namespace CppSharp.AST public QualifiedType ReturnType { get; set; } public bool IsReturnIndirect { get; set; } + public bool HasThisReturn { get; set; } public List Parameters { get; set; } public bool IsVariadic { get; set; } diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 85a81819..437f8530 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -874,6 +874,7 @@ namespace CppSharp _function.ReturnType = typeConverter.VisitQualified(function.ReturnType); _function.IsReturnIndirect = function.IsReturnIndirect; + _function.HasThisReturn = function.HasThisReturn; _function.IsVariadic = function.IsVariadic; _function.IsInline = function.IsInline; _function.IsPure = function.IsPure; diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 744b1705..e5f7f58c 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -558,6 +558,7 @@ public: QualifiedType ReturnType; bool IsReturnIndirect; + bool HasThisReturn; bool IsVariadic; bool IsInline; diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 8ed42504..a76a649a 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/src/CppParser/Bindings/CLI/AST.cpp @@ -1747,6 +1747,16 @@ void CppSharp::Parser::AST::Function::IsReturnIndirect::set(bool value) ((::CppSharp::CppParser::AST::Function*)NativePtr)->IsReturnIndirect = value; } +bool CppSharp::Parser::AST::Function::HasThisReturn::get() +{ + return ((::CppSharp::CppParser::AST::Function*)NativePtr)->HasThisReturn; +} + +void CppSharp::Parser::AST::Function::HasThisReturn::set(bool value) +{ + ((::CppSharp::CppParser::AST::Function*)NativePtr)->HasThisReturn = value; +} + bool CppSharp::Parser::AST::Function::IsVariadic::get() { return ((::CppSharp::CppParser::AST::Function*)NativePtr)->IsVariadic; diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index 3e4f6149..d3b3739f 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -1287,6 +1287,12 @@ namespace CppSharp void set(bool); } + property bool HasThisReturn + { + bool get(); + void set(bool); + } + property bool IsVariadic { bool get(); diff --git a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs index 095830a3..10a4d71b 100644 --- a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs @@ -4309,15 +4309,18 @@ namespace CppSharp public bool IsReturnIndirect; [FieldOffset(93)] - public bool IsVariadic; + public bool HasThisReturn; [FieldOffset(94)] - public bool IsInline; + public bool IsVariadic; [FieldOffset(95)] - public bool IsPure; + public bool IsInline; [FieldOffset(96)] + public bool IsPure; + + [FieldOffset(97)] public bool IsDeleted; [FieldOffset(100)] @@ -4518,6 +4521,21 @@ namespace CppSharp } } + public bool HasThisReturn + { + get + { + var __ptr = (Internal*)__Instance.ToPointer(); + return __ptr->HasThisReturn; + } + + set + { + var __ptr = (Internal*)__Instance.ToPointer(); + __ptr->HasThisReturn = value; + } + } + public bool IsVariadic { get @@ -4666,15 +4684,18 @@ namespace CppSharp public bool IsReturnIndirect; [FieldOffset(93)] - public bool IsVariadic; + public bool HasThisReturn; [FieldOffset(94)] - public bool IsInline; + public bool IsVariadic; [FieldOffset(95)] - public bool IsPure; + public bool IsInline; [FieldOffset(96)] + public bool IsPure; + + [FieldOffset(97)] public bool IsDeleted; [FieldOffset(100)] diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs index 7bf99308..3faeee2e 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs @@ -4309,15 +4309,18 @@ namespace CppSharp public bool IsReturnIndirect; [FieldOffset(129)] - public bool IsVariadic; + public bool HasThisReturn; [FieldOffset(130)] - public bool IsInline; + public bool IsVariadic; [FieldOffset(131)] - public bool IsPure; + public bool IsInline; [FieldOffset(132)] + public bool IsPure; + + [FieldOffset(133)] public bool IsDeleted; [FieldOffset(136)] @@ -4518,6 +4521,21 @@ namespace CppSharp } } + public bool HasThisReturn + { + get + { + var __ptr = (Internal*)__Instance.ToPointer(); + return __ptr->HasThisReturn; + } + + set + { + var __ptr = (Internal*)__Instance.ToPointer(); + __ptr->HasThisReturn = value; + } + } + public bool IsVariadic { get @@ -4666,15 +4684,18 @@ namespace CppSharp public bool IsReturnIndirect; [FieldOffset(129)] - public bool IsVariadic; + public bool HasThisReturn; [FieldOffset(130)] - public bool IsInline; + public bool IsVariadic; [FieldOffset(131)] - public bool IsPure; + public bool IsInline; [FieldOffset(132)] + public bool IsPure; + + [FieldOffset(133)] public bool IsDeleted; [FieldOffset(136)] diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs index 0ac50982..3400e573 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs @@ -4308,15 +4308,18 @@ namespace CppSharp public bool IsReturnIndirect; [FieldOffset(129)] - public bool IsVariadic; + public bool HasThisReturn; [FieldOffset(130)] - public bool IsInline; + public bool IsVariadic; [FieldOffset(131)] - public bool IsPure; + public bool IsInline; [FieldOffset(132)] + public bool IsPure; + + [FieldOffset(133)] public bool IsDeleted; [FieldOffset(136)] @@ -4517,6 +4520,21 @@ namespace CppSharp } } + public bool HasThisReturn + { + get + { + var __ptr = (Internal*)__Instance.ToPointer(); + return __ptr->HasThisReturn; + } + + set + { + var __ptr = (Internal*)__Instance.ToPointer(); + __ptr->HasThisReturn = value; + } + } + public bool IsVariadic { get @@ -4665,15 +4683,18 @@ namespace CppSharp public bool IsReturnIndirect; [FieldOffset(129)] - public bool IsVariadic; + public bool HasThisReturn; [FieldOffset(130)] - public bool IsInline; + public bool IsVariadic; [FieldOffset(131)] - public bool IsPure; + public bool IsInline; [FieldOffset(132)] + public bool IsPure; + + [FieldOffset(133)] public bool IsDeleted; [FieldOffset(136)] diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index b25e0db9..df7bc12e 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -41,6 +41,7 @@ #include #include #include +#include using namespace CppSharp::CppParser; @@ -2216,6 +2217,17 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, Function* F, ParamStartLoc = VD->getLocEnd(); } + auto& CXXABI = CodeGenTypes->getCXXABI(); + bool HasThisReturn = false; + if (auto CD = dyn_cast(FD)) + HasThisReturn = CXXABI.HasThisReturn(GlobalDecl(CD, Ctor_Complete)); + else if (auto DD = dyn_cast(FD)) + HasThisReturn = CXXABI.HasThisReturn(GlobalDecl(DD, Dtor_Complete)); + else + HasThisReturn = CXXABI.HasThisReturn(FD); + + F->HasThisReturn = HasThisReturn; + bool IsMicrosoftABI = C->getASTContext().getTargetInfo().getCXXABI().isMicrosoft(); bool CheckCodeGenInfo = !FD->isDependentContext() && !FD->isInvalidDecl(); CheckCodeGenInfo &= CanCheckCodeGenInfo(C->getSema(), FD->getReturnType().getTypePtr(),