Browse Source

Check if the anon field in a template crashes at the build server

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
template-anon-field
Dimitar Dobrev 5 years ago
parent
commit
aadbd31969
  1. 10
      src/Generator/Passes/FlattenAnonymousTypesToFields.cs
  2. 5
      tests/CSharp/CSharpTemplates.h

10
src/Generator/Passes/FlattenAnonymousTypesToFields.cs

@ -16,15 +16,14 @@ namespace CppSharp.Passes
public override bool VisitClassDecl(Class @class) public override bool VisitClassDecl(Class @class)
{ {
if (!base.VisitClassDecl(@class) || @class.Ignore || @class.IsDependent) if (!base.VisitClassDecl(@class) || @class.Ignore)
return false; return false;
for (int i = @class.Fields.Count - 1; i >= 0; i--) for (int i = @class.Fields.Count - 1; i >= 0; i--)
{ {
Field field = @class.Fields[i]; Field field = @class.Fields[i];
Class fieldType;
if (!string.IsNullOrEmpty(field.OriginalName) || if (!string.IsNullOrEmpty(field.OriginalName) ||
!field.Type.Desugar().TryGetClass(out fieldType) || !field.Type.Desugar().TryGetClass(out Class fieldType) ||
!string.IsNullOrEmpty(fieldType.OriginalName)) !string.IsNullOrEmpty(fieldType.OriginalName))
continue; continue;
@ -39,12 +38,11 @@ namespace CppSharp.Passes
for (int i = @class.Layout.Fields.Count - 1; i >= 0; i--) for (int i = @class.Layout.Fields.Count - 1; i >= 0; i--)
{ {
LayoutField field = @class.Layout.Fields[i]; LayoutField field = @class.Layout.Fields[i];
Class fieldType;
if (!string.IsNullOrEmpty(field.Name) || if (!string.IsNullOrEmpty(field.Name) ||
!field.QualifiedType.Type.Desugar().TryGetClass(out fieldType) || !field.QualifiedType.Type.Desugar().TryGetClass(out Class fieldType) ||
!string.IsNullOrEmpty(fieldType.OriginalName)) !string.IsNullOrEmpty(fieldType.OriginalName))
continue; continue;
ReplaceLayoutField(@class, i, fieldType); ReplaceLayoutField(@class, i, fieldType);
fieldType.Fields.Clear(); fieldType.Fields.Clear();
fieldType.ExplicitlyIgnore(); fieldType.ExplicitlyIgnore();

5
tests/CSharp/CSharpTemplates.h

@ -56,7 +56,12 @@ public:
template <typename AdditionalDependentType> template <typename AdditionalDependentType>
void usesAdditionalDependentType(AdditionalDependentType additionalDependentType); void usesAdditionalDependentType(AdditionalDependentType additionalDependentType);
static const int independentConst; static const int independentConst;
private: private:
struct
{
int fieldInAnonType;
};
float independent; float independent;
}; };

Loading…
Cancel
Save