@@ -125,4 +125,63 @@ struct B {
125125 Assert . That ( structB , Is . Not . Null , "struct B not found" ) ;
126126 Assert . That ( structB . IsPOD , Is . False , "struct B should be not POD" ) ;
127127 }
128+
129+ [ Test ]
130+ public void UnsignedValue ( )
131+ {
132+ ObjectiveCTest . AssertNeedNewClangSharp ( ) ;
133+
134+ var inputContents = $$ """
135+ enum E {
136+ A = 1,
137+ B = 4294967295U,
138+ C = 4294967296U,
139+ D = 18446744073709551615ULL,
140+ E = -1,
141+ F = -4294967295,
142+ G = -4294967296,
143+ H = -18446744073709551615LL,
144+ };
145+ """ ;
146+
147+ using var translationUnit = CreateTranslationUnit ( inputContents ) ;
148+
149+ var decls = translationUnit . TranslationUnitDecl . Decls . OfType < EnumDecl > ( ) . ToList ( ) ;
150+
151+ var enumE = decls . SingleOrDefault ( d => d . Name == "E" ) ! ;
152+ Assert . That ( enumE , Is . Not . Null , "enum E not found" ) ;
153+
154+ var checkField = ( string fieldName , long expectedValue , ulong expectedUnsignedValue , bool negative ) => {
155+ var field = enumE . Enumerators . SingleOrDefault ( e => e . Name == fieldName ) ! ;
156+ Assert . That ( field , Is . Not . Null , $ "enum E::{ fieldName } not found") ;
157+ var initExpr = field . InitExpr ;
158+ Assert . That ( initExpr , Is . Not . Null , $ "enum E::{ fieldName } InitExpr is null") ;
159+
160+ var isNegativeExpression = false ;
161+ var castExpr = ( ImplicitCastExpr ) initExpr ! ;
162+ var subExpr = castExpr . SubExpr ;
163+ if ( subExpr is UnaryOperator unaryOperator )
164+ {
165+ Assert . That ( unaryOperator . Opcode , Is . EqualTo ( CXUnaryOperatorKind . CXUnaryOperator_Minus ) , $ "enum E::{ fieldName } InitExpr is not a minus UnaryOperator") ;
166+ subExpr = unaryOperator . SubExpr ;
167+ isNegativeExpression = true ;
168+ }
169+ var literalExpr = subExpr as IntegerLiteral ;
170+ Assert . That ( literalExpr , Is . Not . Null , $ "enum E::{ fieldName } InitExpr is not IntegerLiteral { castExpr . SubExpr ! . GetType ( ) . Name } ") ;
171+ Assert . That ( literalExpr ! . Value , Is . EqualTo ( expectedValue ) , $ "enum E::{ fieldName } value mismatch") ;
172+ Assert . That ( literalExpr ! . UnsignedValue , Is . EqualTo ( expectedUnsignedValue ) , $ "enum E::{ fieldName } unsigned value mismatch") ;
173+ Assert . That ( negative , Is . EqualTo ( isNegativeExpression ) , $ "enum E::{ fieldName } negative mismatch") ;
174+ } ;
175+
176+ Assert . Multiple ( ( ) => {
177+ checkField ( "A" , 1 , 1 , false ) ;
178+ checkField ( "B" , - 1 , 4294967295UL , false ) ;
179+ checkField ( "C" , 4294967296 , 4294967296UL , false ) ;
180+ checkField ( "D" , - 1 , 18446744073709551615UL , false ) ;
181+ checkField ( "E" , 1 , 1 , true ) ;
182+ checkField ( "F" , 4294967295 , 4294967295 , true ) ;
183+ checkField ( "G" , 4294967296 , 4294967296 , true ) ;
184+ checkField ( "H" , - 1 , 18446744073709551615UL , true ) ;
185+ } ) ;
186+ }
128187}
0 commit comments