@@ -129,8 +129,7 @@ private bool CheckForDefaultPointer(Type desugared, ref string result)
129129 Class @class ;
130130 if ( desugared . GetFinalPointee ( ) . TryGetClass ( out @class ) && @class . IsValueType )
131131 {
132- result = string . Format ( "new {0}()" ,
133- new CSharpTypePrinter ( Context ) . VisitClassDecl ( @class ) ) ;
132+ result = $ "new { @class . Visit ( new CSharpTypePrinter ( Context ) ) } ()";
134133 return true ;
135134 }
136135
@@ -253,15 +252,40 @@ private bool CheckForEnumValue(Type desugared, Statement statement,
253252 if ( call != null && statement . String != "0" )
254253 {
255254 var @params = regexFunctionParams . Match ( statement . String ) . Groups [ 1 ] . Value ;
256- result = TranslateEnumExpression ( call , desugared , @params ) ;
255+ result = TranslateEnumExpression ( desugared , @params ) ;
256+ return true ;
257+ }
258+
259+ if ( desugared . TryGetEnum ( out Enumeration @enum ) &&
260+ int . TryParse ( statement . String , out int value ) )
261+ {
262+ var typePrinter = new CSharpTypePrinter ( Context ) ;
263+ var printedEnum = @enum . Visit ( typePrinter ) ;
264+ if ( value < 0 )
265+ switch ( @enum . BuiltinType . Type )
266+ {
267+ case PrimitiveType . UShort :
268+ case PrimitiveType . UInt :
269+ case PrimitiveType . ULong :
270+ case PrimitiveType . ULongLong :
271+ case PrimitiveType . UInt128 :
272+ result = $@ "({ printedEnum } ) unchecked(({
273+ @enum . BuiltinType . Visit ( typePrinter ) } ) {
274+ statement . String } )" ;
275+ break ;
276+ default :
277+ result = $ "({ printedEnum } ) ({ statement . String } )";
278+ break ;
279+ }
280+ else
281+ result = $ "({ printedEnum } ) { statement . String } ";
257282 return true ;
258283 }
259284
260285 return false ;
261286 }
262287
263- private string TranslateEnumExpression ( Function function ,
264- Type desugared , string @params )
288+ private string TranslateEnumExpression ( Type desugared , string @params )
265289 {
266290 if ( @params . Contains ( "::" ) )
267291 return regexDoubleColon . Replace ( @params , desugared + "." ) ;
0 commit comments