@@ -53,8 +53,11 @@ module TypesCompatibleConfig implements TypeEquivalenceSig {
5353or
5454// Enum types are compatible with one of char, int, or signed int, but the implementation
5555// decides.
56- [ t1 , t2 ] instanceof Enum and
57- ( [ t1 , t2 ] instanceof CharType or [ t1 , t2 ] instanceof IntType )
56+ t1 instanceof Enum and
57+ ( t2 instanceof CharType or t2 instanceof IntType )
58+ or
59+ t2 instanceof Enum and
60+ ( t1 instanceof CharType or t1 instanceof IntType )
5861}
5962
6063bindingset [ t1, t2]
@@ -348,8 +351,15 @@ module FunctionDeclarationTypeEquivalence<TypeEquivalenceSig Config> {
348351predicate equalParameterTypes ( FunctionDeclarationEntry f1 , FunctionDeclarationEntry f2 ) {
349352f1 .getDeclaration ( ) = f2 .getDeclaration ( ) and
350353forall ( int i | exists ( [ f1 , f2 ] .getParameterDeclarationEntry ( i ) ) |
351- TypeEquivalence< Config , FunctionSignatureType > :: equalTypes ( f1 .getParameterDeclarationEntry ( i )
352- .getType ( ) , f2 .getParameterDeclarationEntry ( i ) .getType ( ) )
354+ equalParameterTypesAt ( f1 , f2 , pragma [ only_bind_into ] ( i ) )
355+ )
356+ }
357+
358+ predicate equalParameterTypesAt ( FunctionDeclarationEntry f1 , FunctionDeclarationEntry f2 , int i ) {
359+ pragma [ only_bind_out ] ( f1 .getDeclaration ( ) ) = pragma [ only_bind_out ] ( f2 .getDeclaration ( ) ) and
360+ TypeEquivalence< Config , FunctionSignatureType > :: equalTypes (
361+ f1 .getParameterDeclarationEntry ( i ) .getType ( ) ,
362+ f2 .getParameterDeclarationEntry ( i ) .getType ( )
353363)
354364}
355365}