@@ -952,7 +952,27 @@ void ForFunctionDecl(ParmVarDecl parmVarDecl, FunctionDecl functionDecl)
952952 if ( parmVarDecl . HasDefaultArg )
953953 {
954954 _outputBuilder . BeginParameterDefault ( ) ;
955- UncheckStmt ( typeName , parmVarDecl . DefaultArg ) ;
955+
956+ var defaultArg = parmVarDecl . DefaultArg ;
957+
958+ if ( parmVarDecl . Type . CanonicalType . IsPointerType && ( defaultArg . Handle . Evaluate . Kind == CXEvalResultKind . CXEval_UnExposed ) )
959+ {
960+ if ( ! IsStmtAsWritten < CXXNullPtrLiteralExpr > ( defaultArg , out _ , removeParens : true ) &&
961+ ( ! IsStmtAsWritten < CastExpr > ( defaultArg , out var castExpr , removeParens : true ) || ( castExpr . CastKind != CX_CastKind . CX_CK_NullToPointer ) ) &&
962+ ( ! IsStmtAsWritten < IntegerLiteral > ( defaultArg , out var integerLiteral , removeParens : true ) || ( integerLiteral . Value != 0 ) ) )
963+ {
964+ AddDiagnostic ( DiagnosticLevel . Info , $ "Unsupported default parameter: '{ name } '. Generated bindings may be incomplete.", defaultArg ) ;
965+ }
966+
967+ var outputBuilder = StartCSharpCode ( ) ;
968+ outputBuilder . Write ( "null" ) ;
969+ StopCSharpCode ( ) ;
970+ }
971+ else
972+ {
973+ UncheckStmt ( typeName , parmVarDecl . DefaultArg ) ;
974+ }
975+
956976 _outputBuilder . EndParameterDefault ( ) ;
957977 }
958978
@@ -2521,12 +2541,12 @@ void ForUnderlyingType(TypedefDecl typedefDecl, Type underlyingType)
25212541 if ( _config . LogPotentialTypedefRemappings )
25222542 {
25232543 var typedefName = typedefDecl . UnderlyingDecl . Name ;
2524- var possibleNamesToRemap = new string [ ] { "_" + typedefName , "_tag" + typedefName , "tag" + typedefName } ;
2544+ var possibleNamesToRemap = new string [ ] { "_" + typedefName , "_tag" + typedefName , "tag" + typedefName , typedefName + "_tag" } ;
25252545 var underlyingName = underlyingTagType . AsString ;
25262546
25272547 foreach ( var possibleNameToRemap in possibleNamesToRemap )
25282548 {
2529- if ( ! _config . RemappedNames . ContainsKey ( possibleNameToRemap ) )
2549+ if ( ! _config . RemappedNames . ContainsKey ( possibleNameToRemap ) && ! _config . RemappedNames . ContainsKey ( possibleNameToRemap + "*" ) )
25302550 {
25312551 if ( possibleNameToRemap == underlyingName )
25322552 {
@@ -2704,7 +2724,7 @@ private void VisitVarDecl(VarDecl varDecl)
27042724 }
27052725 }
27062726 }
2707- else if ( ( type . IsLocalConstQualified || isMacroDefinitionRecord ) && CanBeConstant ( type , varDecl . Init ) )
2727+ else if ( ( type . IsLocalConstQualified || isMacroDefinitionRecord ) && CanBeConstant ( type , typeName , varDecl . Init ) )
27082728 {
27092729 kind |= ConstantKind . PrimitiveConstant ;
27102730 }
@@ -2820,15 +2840,15 @@ void ForDeclStmt(VarDecl varDecl, DeclStmt declStmt)
28202840 StopCSharpCode ( ) ;
28212841 }
28222842
2823- bool CanBeConstant ( Type type , Expr initExpr )
2843+ bool CanBeConstant ( Type type , string targetTypeName , Expr initExpr )
28242844 {
28252845 if ( type is AttributedType attributedType )
28262846 {
2827- return CanBeConstant ( attributedType . ModifiedType , initExpr ) ;
2847+ return CanBeConstant ( attributedType . ModifiedType , targetTypeName , initExpr ) ;
28282848 }
28292849 else if ( type is AutoType autoType )
28302850 {
2831- return CanBeConstant ( autoType . CanonicalType , initExpr ) ;
2851+ return CanBeConstant ( autoType . CanonicalType , targetTypeName , initExpr ) ;
28322852 }
28332853 else if ( type is BuiltinType builtinType )
28342854 {
@@ -2852,28 +2872,28 @@ bool CanBeConstant(Type type, Expr initExpr)
28522872 case CXTypeKind . CXType_Float :
28532873 case CXTypeKind . CXType_Double :
28542874 {
2855- return IsConstant ( initExpr ) ;
2875+ return IsConstant ( targetTypeName , initExpr ) ;
28562876 }
28572877 }
28582878 }
28592879 else if ( type is ElaboratedType elaboratedType )
28602880 {
2861- return CanBeConstant ( elaboratedType . NamedType , initExpr ) ;
2881+ return CanBeConstant ( elaboratedType . NamedType , targetTypeName , initExpr ) ;
28622882 }
28632883 else if ( type is EnumType enumType )
28642884 {
2865- return CanBeConstant ( enumType . Decl . IntegerType , initExpr ) ;
2885+ return CanBeConstant ( enumType . Decl . IntegerType , targetTypeName , initExpr ) ;
28662886 }
28672887 else if ( type is TypedefType typedefType )
28682888 {
2869- return CanBeConstant ( typedefType . Decl . UnderlyingType , initExpr ) ;
2889+ return CanBeConstant ( typedefType . Decl . UnderlyingType , targetTypeName , initExpr ) ;
28702890 }
28712891
28722892 return false ;
28732893 }
28742894 }
28752895
2876- private bool IsConstant ( Expr initExpr )
2896+ private bool IsConstant ( string targetTypeName , Expr initExpr )
28772897 {
28782898 switch ( initExpr . StmtClass )
28792899 {
@@ -2882,7 +2902,7 @@ private bool IsConstant(Expr initExpr)
28822902 case CX_StmtClass . CX_StmtClass_ConditionalOperator :
28832903 {
28842904 var conditionalOperator = ( ConditionalOperator ) initExpr ;
2885- return IsConstant ( conditionalOperator . Cond ) && IsConstant ( conditionalOperator . LHS ) && IsConstant ( conditionalOperator . RHS ) ;
2905+ return IsConstant ( targetTypeName , conditionalOperator . Cond ) && IsConstant ( targetTypeName , conditionalOperator . LHS ) && IsConstant ( targetTypeName , conditionalOperator . RHS ) ;
28862906 }
28872907
28882908 // case CX_StmtClass.CX_StmtClass_AddrLabelExpr:
@@ -2901,7 +2921,7 @@ private bool IsConstant(Expr initExpr)
29012921 case CX_StmtClass . CX_StmtClass_BinaryOperator :
29022922 {
29032923 var binaryOperator = ( BinaryOperator ) initExpr ;
2904- return IsConstant ( binaryOperator . LHS ) && IsConstant ( binaryOperator . RHS ) ;
2924+ return IsConstant ( targetTypeName , binaryOperator . LHS ) && IsConstant ( targetTypeName , binaryOperator . RHS ) ;
29052925 }
29062926
29072927 // case CX_StmtClass.CX_StmtClass_CompoundAssignOperator:
@@ -2982,7 +3002,7 @@ private bool IsConstant(Expr initExpr)
29823002 case CX_StmtClass . CX_StmtClass_CXXFunctionalCastExpr :
29833003 {
29843004 var cxxFunctionalCastExpr = ( ExplicitCastExpr ) initExpr ;
2985- return IsConstant ( cxxFunctionalCastExpr . SubExprAsWritten ) ;
3005+ return IsConstant ( targetTypeName , cxxFunctionalCastExpr . SubExprAsWritten ) ;
29863006 }
29873007
29883008 // case CX_StmtClass.CX_StmtClass_CXXConstCastExpr:
@@ -2993,7 +3013,7 @@ private bool IsConstant(Expr initExpr)
29933013 case CX_StmtClass . CX_StmtClass_ImplicitCastExpr :
29943014 {
29953015 var implicitCastExpr = ( ImplicitCastExpr ) initExpr ;
2996- return IsConstant ( implicitCastExpr . SubExprAsWritten ) ;
3016+ return IsConstant ( targetTypeName , implicitCastExpr . SubExprAsWritten ) ;
29973017 }
29983018
29993019 case CX_StmtClass . CX_StmtClass_CharacterLiteral :
@@ -3012,7 +3032,7 @@ private bool IsConstant(Expr initExpr)
30123032 {
30133033 var declRefExpr = ( DeclRefExpr ) initExpr ;
30143034 return ( declRefExpr . Decl is EnumConstantDecl ) ||
3015- ( ( declRefExpr . Decl is VarDecl varDecl ) && varDecl . HasInit && IsConstant ( varDecl . Init ) ) ;
3035+ ( ( declRefExpr . Decl is VarDecl varDecl ) && varDecl . HasInit && IsConstant ( targetTypeName , varDecl . Init ) ) ;
30163036 }
30173037
30183038 // case CX_StmtClass.CX_StmtClass_DependentCoawaitExpr:
@@ -3033,7 +3053,7 @@ private bool IsConstant(Expr initExpr)
30333053 case CX_StmtClass . CX_StmtClass_ExprWithCleanups :
30343054 {
30353055 var exprWithCleanups = ( ExprWithCleanups ) initExpr ;
3036- return IsConstant ( exprWithCleanups . SubExpr ) ;
3056+ return IsConstant ( targetTypeName , exprWithCleanups . SubExpr ) ;
30373057 }
30383058
30393059 // case CX_StmtClass.CX_StmtClass_FunctionParmPackExpr:
@@ -3089,7 +3109,7 @@ private bool IsConstant(Expr initExpr)
30893109 case CX_StmtClass . CX_StmtClass_ParenExpr :
30903110 {
30913111 var parenExpr = ( ParenExpr ) initExpr ;
3092- return IsConstant ( parenExpr . SubExpr ) ;
3112+ return IsConstant ( targetTypeName , parenExpr . SubExpr ) ;
30933113 }
30943114
30953115 case CX_StmtClass . CX_StmtClass_ParenListExpr :
@@ -3098,7 +3118,7 @@ private bool IsConstant(Expr initExpr)
30983118
30993119 foreach ( var expr in parenListExpr . Exprs )
31003120 {
3101- if ( IsConstant ( expr ) )
3121+ if ( IsConstant ( targetTypeName , expr ) )
31023122 {
31033123 return true ;
31043124 }
@@ -3159,7 +3179,18 @@ private bool IsConstant(Expr initExpr)
31593179 case CX_StmtClass . CX_StmtClass_UnaryOperator :
31603180 {
31613181 var unaryOperator = ( UnaryOperator ) initExpr ;
3162- return IsConstant ( unaryOperator . SubExpr ) ;
3182+
3183+ if ( ! IsConstant ( targetTypeName , unaryOperator . SubExpr ) )
3184+ {
3185+ return false ;
3186+ }
3187+
3188+ if ( unaryOperator . Opcode != CX_UnaryOperatorKind . CX_UO_Minus )
3189+ {
3190+ return true ;
3191+ }
3192+
3193+ return targetTypeName is not "IntPtr" and not "nint" and not "nuint" and not "UIntPtr" ;
31633194 }
31643195
31653196 // case CX_StmtClass.CX_StmtClass_VAArgExpr:
0 commit comments