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();