diff --git a/src/AST/Statement.cs b/src/AST/Statement.cs index b1ae1985..630565c9 100644 --- a/src/AST/Statement.cs +++ b/src/AST/Statement.cs @@ -4,7 +4,8 @@ { Any, DeclarationReference, - ConstructorReference + ConstructorReference, + CXXOperatorCall } public abstract class Statement diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 6a09a77f..eca866a6 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -855,6 +855,9 @@ namespace CppSharp case StatementClass.CXXConstructExprClass: expression.Class = AST.StatementClass.ConstructorReference; break; + case StatementClass.CXXOperatorCallExpr: + expression.Class = AST.StatementClass.CXXOperatorCall; + break; } return expression; } diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 98a7024c..05e6ee19 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -459,7 +459,8 @@ enum class StatementClass { Any, DeclRefExprClass, - CXXConstructExprClass + CXXConstructExprClass, + CXXOperatorCallExpr }; class CS_API Statement diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index 4403ad43..da6964c7 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -211,7 +211,8 @@ namespace CppSharp { Any = 0, DeclRefExprClass = 1, - CXXConstructExprClass = 2 + CXXConstructExprClass = 2, + CXXOperatorCallExpr = 3 }; public enum struct TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs index 430375ff..3d80a940 100644 --- a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs @@ -135,7 +135,8 @@ namespace CppSharp { Any = 0, DeclRefExprClass = 1, - CXXConstructExprClass = 2 + CXXConstructExprClass = 2, + CXXOperatorCallExpr = 3 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs index 9575d83f..06c0fc99 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs @@ -135,7 +135,8 @@ namespace CppSharp { Any = 0, DeclRefExprClass = 1, - CXXConstructExprClass = 2 + CXXConstructExprClass = 2, + CXXOperatorCallExpr = 3 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs index c307baa5..727d7aae 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs @@ -135,7 +135,8 @@ namespace CppSharp { Any = 0, DeclRefExprClass = 1, - CXXConstructExprClass = 2 + CXXConstructExprClass = 2, + CXXOperatorCallExpr = 3 } public enum TemplateSpecializationKind diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index cde23958..13934c38 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2466,6 +2466,9 @@ AST::Expression* Parser::WalkStatement(clang::Stmt* Statement) case Stmt::CXXStaticCastExprClass: case Stmt::ImplicitCastExprClass: return WalkStatement(cast(Statement)->getSubExprAsWritten()); + case Stmt::CXXOperatorCallExprClass: + return new AST::Expression(GetStringFromStatement(Statement), StatementClass::CXXOperatorCallExpr, + WalkDeclaration(cast(Statement)->getCalleeDecl())); case Stmt::CXXConstructExprClass: case Stmt::CXXTemporaryObjectExprClass: { diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index 47f30034..8dc8a6e5 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -13,7 +13,7 @@ namespace CppSharp.Passes { public class HandleDefaultParamValuesPass : TranslationUnitPass { - private static readonly Regex regexFunctionParams = new Regex(@"\((.+)\)", RegexOptions.Compiled); + private static readonly Regex regexFunctionParams = new Regex(@"\(?(.+)\)?", RegexOptions.Compiled); private static readonly Regex regexDoubleColon = new Regex(@"\w+::", RegexOptions.Compiled); private static readonly Regex regexName = new Regex(@"(\w+)", RegexOptions.Compiled); @@ -120,8 +120,8 @@ namespace CppSharp.Passes return true; } - var call = parameter.DefaultArgument.Declaration as Method; - if (call != null && call.IsConstructor) + var call = parameter.DefaultArgument.Declaration as Function; + if (call != null) { string @params = regexFunctionParams.Match(parameter.DefaultArgument.String).Groups[1].Value; diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index ac9cbfc4..c665bf3e 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -222,6 +222,16 @@ TestCopyConstructorVal::TestCopyConstructorVal(const TestCopyConstructorVal& oth B = other.B; } +Flags operator|(Flags lhs, Flags rhs) +{ + return static_cast(static_cast(lhs) | static_cast(rhs)); +} + +UntypedFlags operator|(UntypedFlags lhs, UntypedFlags rhs) +{ + return static_cast(static_cast(lhs) | static_cast(rhs)); +} + void MethodsWithDefaultValues::DefaultPointer(Foo *ptr) { } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 8fc93df2..9d5f2d44 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -187,6 +187,24 @@ struct DLL_API ValueType { }; +enum class Flags +{ + Flag1 = 1, + Flag2 = 2, + Flag3 = 4 +}; + +DLL_API Flags operator|(Flags lhs, Flags rhs); + +enum UntypedFlags +{ + Flag1 = 1, + Flag2 = 2, + Flag3 = 4 +}; + +UntypedFlags operator|(UntypedFlags lhs, UntypedFlags rhs); + class DLL_API MethodsWithDefaultValues { public: @@ -198,6 +216,8 @@ public: 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()); + void DefaultEnumAssignedBitwiseOr(Flags flags = Flags::Flag1 | Flags::Flag2); + void DefaultEnumAssignedBitwiseOrShort(UntypedFlags flags = Flag1 | Flag2); }; class DLL_API HasPrivateOverrideBase