33private import rust
44private import codeql.rust.internal.PathResolution
55private import TypeMention
6+ private import TypeInference
67private import codeql.rust.internal.CachedStages
78private import codeql.rust.elements.internal.generated.Raw
89private import codeql.rust.elements.internal.generated.Synth
@@ -36,8 +37,13 @@ newtype TType =
3637 TTrait ( Trait t ) or
3738 TImplTraitType ( ImplTraitTypeRepr impl ) or
3839 TDynTraitType ( Trait t ) { t = any ( DynTraitTypeRepr dt ) .getTrait ( ) } or
39- TNeverType ( ) or
4040 TUnknownType ( ) or
41+ TClosureParameterPseudoType ( Param p ) {
42+ exists ( ClosureExpr ce |
43+ p = ce .getParam ( _) and
44+ not p .hasTypeRepr ( )
45+ )
46+ } or
4147 TTypeParamTypeParameter ( TypeParam t ) or
4248 TAssociatedTypeTypeParameter ( Trait trait , AssocType typeAlias ) {
4349 getTraitAssocType ( trait ) = typeAlias
@@ -326,14 +332,6 @@ TypeParamTypeParameter getSliceTypeParameter() {
326332 result = any ( SliceType t ) .getPositionalTypeParameter ( 0 )
327333}
328334
329- class NeverType extends Type , TNeverType {
330- override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
331-
332- override string toString ( ) { result = "!" }
333-
334- override Location getLocation ( ) { result instanceof EmptyLocation }
335- }
336-
337335abstract class PtrType extends StructType { }
338336
339337pragma [ nomagic]
@@ -355,6 +353,10 @@ class PtrConstType extends PtrType {
355353 override string toString ( ) { result = "*const" }
356354}
357355
356+ abstract class PseudoType extends Type {
357+ override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
358+ }
359+
358360/**
359361 * A special pseudo type used to indicate that the actual type may have to be
360362 * inferred by propagating type information back into call arguments.
@@ -377,14 +379,24 @@ class PtrConstType extends PtrType {
377379 * into call arguments (including method call receivers), in order to avoid
378380 * combinatorial explosions.
379381 */
380- class UnknownType extends Type , TUnknownType {
381- override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
382-
383- override string toString ( ) { result = "(context typed)" }
382+ class UnknownType extends PseudoType , TUnknownType {
383+ override string toString ( ) { result = "(unknown type)" }
384384
385385 override Location getLocation ( ) { result instanceof EmptyLocation }
386386}
387387
388+ class ClosureParameterPseudoType extends PseudoType , TClosureParameterPseudoType {
389+ private Param param ;
390+
391+ ClosureParameterPseudoType ( ) { this = TClosureParameterPseudoType ( param ) }
392+
393+ Param getParam ( ) { result = param }
394+
395+ override string toString ( ) { result = "(closure parameter " + param + ")" }
396+
397+ override Location getLocation ( ) { result = param .getLocation ( ) }
398+ }
399+
388400/** A type parameter. */
389401abstract class TypeParameter extends Type {
390402 override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
0 commit comments