Skip to content

Commit 1fc1b4e

Browse files
committed
Fix default arguments to only map to null if pointers
This bug is revealed by properly fixing the reading of ABI parameters in the parser. Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 458293e commit 1fc1b4e

File tree

8 files changed

+25
-33
lines changed

8 files changed

+25
-33
lines changed

src/AST/FunctionExtensions.cs

+2-12
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,8 @@ public static IList<Parameter> GatherInternalParams(this Function function,
1616

1717
var pointer = new QualifiedType(new PointerType(new QualifiedType(new BuiltinType(PrimitiveType.Void))));
1818

19-
if (isInstanceMethod && !isItaniumLikeAbi)
20-
{
21-
@params.Add(new Parameter
22-
{
23-
QualifiedType = pointer,
24-
Name = "__instance",
25-
Namespace = function
26-
});
27-
}
28-
29-
if (!function.HasIndirectReturnTypeParameter &&
30-
isInstanceMethod && isItaniumLikeAbi)
19+
if (isInstanceMethod &&
20+
(!isItaniumLikeAbi || !function.HasIndirectReturnTypeParameter))
3121
{
3222
@params.Add(new Parameter
3323
{

src/CppParser/Parser.cpp

+5-11
Original file line numberDiff line numberDiff line change
@@ -2923,14 +2923,9 @@ Enumeration::Item* Parser::WalkEnumItem(clang::EnumConstantDecl* ECD)
29232923
static const clang::CodeGen::CGFunctionInfo& GetCodeGenFunctionInfo(
29242924
clang::CodeGen::CodeGenTypes* CodeGenTypes, const clang::FunctionDecl* FD)
29252925
{
2926-
using namespace clang;
2927-
if (auto CD = dyn_cast<clang::CXXConstructorDecl>(FD)) {
2928-
return CodeGenTypes->arrangeCXXStructorDeclaration(CD);
2929-
} else if (auto DD = dyn_cast<clang::CXXDestructorDecl>(FD)) {
2930-
return CodeGenTypes->arrangeCXXStructorDeclaration(DD);
2931-
}
2932-
2933-
return CodeGenTypes->arrangeFunctionDeclaration(FD);
2926+
auto FTy = FD->getType()->getCanonicalTypeUnqualified();
2927+
return CodeGenTypes->arrangeFreeFunctionType(
2928+
FTy.castAs<clang::FunctionProtoType>());
29342929
}
29352930

29362931
bool Parser::CanCheckCodeGenInfo(clang::Sema& S, const clang::Type* Ty)
@@ -3294,9 +3289,8 @@ void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F,
32943289
unsigned Index = 0;
32953290
for (const auto& Arg : CGInfo.arguments())
32963291
{
3297-
if (Index >= F->Parameters.size())
3298-
continue;
3299-
F->Parameters[Index++]->isIndirect = Arg.info.isIndirect();
3292+
F->Parameters[Index++]->isIndirect =
3293+
Arg.info.isIndirect() && !Arg.info.getIndirectByVal();
33003294
}
33013295

33023296
MarkValidity(F);

src/Generator/Driver.cs

-5
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,6 @@ public void SetupPasses(ILibrary library)
253253

254254
if (Options.IsCSharpGenerator)
255255
{
256-
if (Options.GenerateDefaultValuesForArguments)
257-
{
258-
TranslationUnitPasses.AddPass(new FixDefaultParamValuesOfOverridesPass());
259-
TranslationUnitPasses.AddPass(new HandleDefaultParamValuesPass());
260-
}
261256
TranslationUnitPasses.AddPass(new GenerateAbstractImplementationsPass());
262257
TranslationUnitPasses.AddPass(new MultipleInheritancePass());
263258
}

src/Generator/Generators/CSharp/CSharpGenerator.cs

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ public override List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units)
2525

2626
public override bool SetupPasses()
2727
{
28+
if (Context.Options.GenerateDefaultValuesForArguments)
29+
{
30+
Context.TranslationUnitPasses.AddPass(new FixDefaultParamValuesOfOverridesPass());
31+
Context.TranslationUnitPasses.AddPass(new HandleDefaultParamValuesPass());
32+
}
33+
2834
// Both the CheckOperatorsOverloadsPass and CheckAbiParameters can
2935
// create and and new parameters to functions and methods. Make sure
3036
// CheckAbiParameters runs last because hidden structure parameters

src/Generator/Passes/HandleDefaultParamValuesPass.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public override bool VisitFunctionDecl(Function function)
7575
{
7676
var desugared = type.Desugar();
7777

78-
if (!desugared.IsPrimitiveTypeConvertibleToRef() &&
78+
if (desugared.IsAddress() && !desugared.IsPrimitiveTypeConvertibleToRef() &&
7979
(expression.String == "0" || expression.String == "nullptr"))
8080
{
8181
result = desugared.GetPointee()?.Desugar() is FunctionType ?

tests/CSharp/CSharp.Tests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ public void TestDefaultArguments()
249249
methodsWithDefaultValues.DefaultMappedToZeroEnum();
250250
methodsWithDefaultValues.DefaultMappedToEnumAssignedWithCtor();
251251
methodsWithDefaultValues.DefaultZeroMappedToEnumAssignedWithCtor();
252-
methodsWithDefaultValues.DefaultImplicitCtorInt();
252+
Assert.That(methodsWithDefaultValues.DefaultImplicitCtorInt().Priv, Is.EqualTo(0));
253253
methodsWithDefaultValues.DefaultImplicitCtorChar();
254254
methodsWithDefaultValues.DefaultImplicitCtorFoo();
255255
methodsWithDefaultValues.DefaultImplicitCtorEnum();

tests/CSharp/CSharp.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ Quux::Quux() : _setterWithDefaultOverload(0)
117117

118118
Quux::Quux(int i) : Quux()
119119
{
120-
120+
priv = i;
121121
}
122122

123123
Quux::Quux(char c) : Quux()
@@ -139,6 +139,11 @@ Quux::~Quux()
139139
}
140140
}
141141

142+
int Quux::getPriv() const
143+
{
144+
return priv;
145+
}
146+
142147
Foo* Quux::setterWithDefaultOverload()
143148
{
144149
return _setterWithDefaultOverload;
@@ -645,8 +650,9 @@ void MethodsWithDefaultValues::defaultZeroMappedToEnumAssignedWithCtor(DefaultZe
645650
{
646651
}
647652

648-
void MethodsWithDefaultValues::defaultImplicitCtorInt(Quux arg)
653+
Quux MethodsWithDefaultValues::defaultImplicitCtorInt(Quux arg)
649654
{
655+
return arg;
650656
}
651657

652658
void MethodsWithDefaultValues::defaultImplicitCtorChar(Quux arg)

tests/CSharp/CSharp.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class DLL_API Quux
5656
Quux(Foo f);
5757
~Quux();
5858

59+
int getPriv() const;
5960
Foo* setterWithDefaultOverload();
6061
void setSetterWithDefaultOverload(Foo* value = new Foo());
6162

@@ -419,7 +420,7 @@ class DLL_API MethodsWithDefaultValues : public Quux
419420
void defaultMappedToZeroEnum(QFlags<Flags> qFlags = 0);
420421
void defaultMappedToEnumAssignedWithCtor(QFlags<Flags> qFlags = QFlags<Flags>());
421422
void defaultZeroMappedToEnumAssignedWithCtor(DefaultZeroMappedToEnum defaultZeroMappedToEnum = DefaultZeroMappedToEnum());
422-
void defaultImplicitCtorInt(Quux arg = 0);
423+
Quux defaultImplicitCtorInt(Quux arg = 0);
423424
void defaultImplicitCtorChar(Quux arg = 'a');
424425
void defaultImplicitCtorFoo(Quux arg = Foo());
425426
// this looks the same test as 'defaultRefTypeEnumImplicitCtor' two lines below

0 commit comments

Comments
 (0)