From 2bc06983f30d1222ea01f3cc57dbe495cc2acc64 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Thu, 21 Aug 2014 23:26:44 +0300 Subject: [PATCH] Fixed the generation of default argument when a reference is assigned a value. Signed-off-by: Dimitar Dobrev --- src/CppParser/Parser.cpp | 12 ++++++++---- tests/CSharpTemp/CSharpTemp.cpp | 4 ++++ tests/CSharpTemp/CSharpTemp.h | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 5bf5eead..cde23958 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2467,12 +2467,16 @@ AST::Expression* Parser::WalkStatement(clang::Stmt* Statement) case Stmt::ImplicitCastExprClass: return WalkStatement(cast(Statement)->getSubExprAsWritten()); case Stmt::CXXConstructExprClass: + case Stmt::CXXTemporaryObjectExprClass: { auto ConstructorExpr = cast(Statement); - auto Arg = ConstructorExpr->getArg(0); - auto TemporaryExpr = dyn_cast(Arg); - if (TemporaryExpr && isa(TemporaryExpr->GetTemporaryExpr())) - return WalkStatement(TemporaryExpr->GetTemporaryExpr()); + if (ConstructorExpr->getNumArgs() > 0) + { + auto Arg = ConstructorExpr->getArg(0); + auto TemporaryExpr = dyn_cast(Arg); + if (TemporaryExpr && isa(TemporaryExpr->GetTemporaryExpr())) + return WalkStatement(TemporaryExpr->GetTemporaryExpr()); + } return new AST::Expression(GetStringFromStatement(Statement), StatementClass::CXXConstructExprClass, WalkDeclaration(ConstructorExpr->getConstructor())); } diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 17cbee4e..ac9cbfc4 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -250,6 +250,10 @@ void MethodsWithDefaultValues::DefaultIntAssignedAnEnum(int i) { } +void MethodsWithDefaultValues::DefaultRefAssignedValue(const Foo &fooRef) +{ +} + void HasPrivateOverrideBase::privateOverride(int i) { } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 3d64d403..8fc93df2 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -197,6 +197,7 @@ public: void DefaultRefTypeAfterOthers(int i = 5, Bar::Items item = Bar::Item2, Foo foo = Foo()); void DefaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz()); void DefaultIntAssignedAnEnum(int i = Bar::Item1); + void DefaultRefAssignedValue(const Foo& fooRef = Foo()); }; class DLL_API HasPrivateOverrideBase