Skip to content

Commit 3dba1eb

Browse files
committed
Exported entire specialisations when they only have valid functions.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 1ebf418 commit 3dba1eb

File tree

5 files changed

+36
-12
lines changed

5 files changed

+36
-12
lines changed

src/AST/Declaration.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ private static string GetDeclName(Declaration decl, string name)
206206
// Comment associated with declaration.
207207
public RawComment Comment;
208208

209+
public bool IsInvalid { get; set; }
210+
209211
private GenerationKind? generationKind;
210212

211213
public GenerationKind GenerationKind

src/Generator/Passes/CheckIgnoredDecls.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ public override bool VisitDeclaration(Declaration decl)
8181
if (decl.GenerationKind == GenerationKind.None)
8282
return true;
8383

84+
if (decl.IsInvalid)
85+
{
86+
decl.ExplicitlyIgnore();
87+
return true;
88+
}
89+
8490
if (!CheckDeclarationAccess(decl))
8591
{
8692
Diagnostics.Debug("Decl '{0}' was ignored due to invalid access",

src/Generator/Passes/GenerateSymbolsPass.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,16 @@ private void GenerateSymbols()
5050
{
5151
symbolsCodeGenerator.NewLine();
5252
foreach (var specialization in specializations[module])
53-
foreach (var method in specialization.Methods.Where(
54-
m => m.IsGenerated && !m.IsDependent && !m.IsImplicit &&
55-
!m.IsDeleted && !m.IsDefaulted))
56-
symbolsCodeGenerator.VisitMethodDecl(method);
53+
{
54+
Func<Method, bool> exportable = m => !m.IsDependent &&
55+
!m.IsImplicit && !m.IsDeleted && !m.IsDefaulted;
56+
if (specialization.Methods.Any(m => m.IsInvalid && exportable(m)))
57+
foreach (var method in specialization.Methods.Where(
58+
m => m.IsGenerated && exportable(m)))
59+
symbolsCodeGenerator.VisitMethodDecl(method);
60+
else
61+
symbolsCodeGenerator.VisitClassTemplateSpecializationDecl(specialization);
62+
}
5763
}
5864

5965
var cpp = $"{module.SymbolsLibraryName}.{symbolsCodeGenerator.FileExtension}";

src/Generator/Passes/SymbolsCodeGenerator.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,17 @@ public override void Process()
2727
NewLine();
2828
}
2929

30+
public override bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
31+
{
32+
WriteLine($"template class {GetExporting()}{specialization.Visit(cppTypePrinter)};");
33+
return true;
34+
}
35+
3036
public override bool VisitMethodDecl(Method method)
3137
{
3238
if (method.Namespace is ClassTemplateSpecialization)
3339
{
34-
var exporting = string.Empty;
35-
if (Context.ParserOptions.IsMicrosoftAbi)
36-
exporting = "__declspec(dllexport) ";
37-
else if (TargetTriple.IsMacOS(Context.ParserOptions.TargetTriple))
38-
exporting = "__attribute__((visibility(\"default\"))) ";
39-
WriteLine($"template {exporting}{method.Visit(cppTypePrinter)};");
40+
WriteLine($"template {GetExporting()}{method.Visit(cppTypePrinter)};");
4041
return true;
4142
}
4243
if (method.IsConstructor)
@@ -58,6 +59,16 @@ public override bool VisitFunctionDecl(Function function)
5859
return true;
5960
}
6061

62+
private string GetExporting()
63+
{
64+
var exporting = string.Empty;
65+
if (Context.ParserOptions.IsMicrosoftAbi)
66+
exporting = "__declspec(dllexport) ";
67+
else if (TargetTriple.IsMacOS(Context.ParserOptions.TargetTriple))
68+
exporting = "__attribute__((visibility(\"default\"))) ";
69+
return exporting;
70+
}
71+
6172
private string GetWrapper(Module module)
6273
{
6374
var symbolsLibraryName = new StringBuilder(module.SymbolsLibraryName);

src/Parser/ASTConverter.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -945,8 +945,7 @@ void VisitDeclaration(Declaration decl, AST.Declaration _decl)
945945
_decl.IsIncomplete = decl.IsIncomplete;
946946
_decl.IsDependent = decl.IsDependent;
947947
_decl.IsImplicit = decl.IsImplicit;
948-
if (decl.IsInvalid)
949-
_decl.GenerationKind = AST.GenerationKind.None;
948+
_decl.IsInvalid = decl.IsInvalid;
950949
_decl.DefinitionOrder = decl.DefinitionOrder;
951950
_decl.MaxFieldAlignment = decl.MaxFieldAlignment;
952951

0 commit comments

Comments
 (0)