diff --git a/src/Bridge/ASTVisitor.cs b/src/Bridge/ASTVisitor.cs index 1f72d842..7dfc976e 100644 --- a/src/Bridge/ASTVisitor.cs +++ b/src/Bridge/ASTVisitor.cs @@ -137,6 +137,14 @@ namespace CppSharp return typedef.Declaration.Visit(this); } + public bool VisitDecayedType(DecayedType decayed, TypeQualifiers quals) + { + if (!VisitType(decayed, quals)) + return false; + + return decayed.Decayed.Visit(this); + } + public virtual bool VisitTemplateSpecializationType(TemplateSpecializationType template, TypeQualifiers quals) { diff --git a/src/Bridge/Type.cs b/src/Bridge/Type.cs index ba9747e3..f0977d33 100644 --- a/src/Bridge/Type.cs +++ b/src/Bridge/Type.cs @@ -311,6 +311,26 @@ namespace CppSharp } } + /// + /// Represents a pointer type decayed from an array or function type. + /// + public class DecayedType : Type + { + public DecayedType() + { + + } + + public QualifiedType Decayed; + public QualifiedType Original; + public QualifiedType Pointee; + + public override T Visit(ITypeVisitor visitor, TypeQualifiers quals) + { + return visitor.VisitDecayedType(this, quals); + } + } + /// /// Represents a template argument within a class template specialization. /// @@ -515,6 +535,7 @@ namespace CppSharp T VisitMemberPointerType(MemberPointerType member, TypeQualifiers quals); T VisitBuiltinType(BuiltinType builtin, TypeQualifiers quals); T VisitTypedefType(TypedefType typedef, TypeQualifiers quals); + T VisitDecayedType(DecayedType decayed, TypeQualifiers quals); T VisitTemplateSpecializationType(TemplateSpecializationType template, TypeQualifiers quals); T VisitPrimitiveType(PrimitiveType type, TypeQualifiers quals); diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 5fe9b8a6..174b8564 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -194,6 +194,11 @@ namespace CppSharp.Generators.CLI return decl.Type.Visit(this); } + public string VisitDecayedType(DecayedType decayed, TypeQualifiers quals) + { + return decayed.Decayed.Visit(this); + } + public string VisitTemplateSpecializationType(TemplateSpecializationType template, TypeQualifiers quals) { diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index 78ff3c09..abd1b247 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -231,6 +231,11 @@ namespace CppSharp.Generators.CSharp return decl.Type.Visit(this); } + public CSharpTypePrinterResult VisitDecayedType(DecayedType decayed, TypeQualifiers quals) + { + return decayed.Decayed.Visit(this); + } + public CSharpTypePrinterResult VisitTemplateSpecializationType( TemplateSpecializationType template, TypeQualifiers quals) { diff --git a/src/Generator/Types/CppTypePrinter.cs b/src/Generator/Types/CppTypePrinter.cs index 30ec7deb..17fc4695 100644 --- a/src/Generator/Types/CppTypePrinter.cs +++ b/src/Generator/Types/CppTypePrinter.cs @@ -94,6 +94,11 @@ namespace CppSharp.Types return "::" + typedef.Declaration.QualifiedOriginalName; } + public string VisitDecayedType(DecayedType decayed, TypeQualifiers quals) + { + return decayed.Decayed.Visit(this); + } + public string VisitTemplateSpecializationType(TemplateSpecializationType template, TypeQualifiers quals) { var decl = template.Template.TemplatedDecl; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 55f99f47..dfb6c847 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -896,6 +896,18 @@ CppSharp::Type^ Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, return Type; } + case Type::Decayed: + { + auto DT = Type->getAs(); + auto Next = TL->getNextTypeLoc(); + + auto Type = gcnew CppSharp::DecayedType(); + Type->Decayed = GetQualifiedType(DT->getDecayedType(), WalkType(DT->getDecayedType(), &Next)); + Type->Original = GetQualifiedType(DT->getOriginalType(), WalkType(DT->getOriginalType(), &Next)); + Type->Pointee = GetQualifiedType(DT->getPointeeType(), WalkType(DT->getPointeeType(), &Next)); + + return Type; + } case Type::Elaborated: { auto ET = Type->getAs();