@@ -86,6 +86,41 @@ private class StdIterator extends Iterator, Class {
8686 override Type getValueType ( ) { result = this .getTemplateArgument ( 1 ) .( Type ) .getUnderlyingType ( ) }
8787}
8888
89+ private class StdReverseIterator extends Iterator , Class {
90+ StdReverseIterator ( ) { this .hasQualifiedName ( [ "std" , "bsl" ] , "reverse_iterator" ) }
91+
92+ override Type getValueType ( ) { result = this .getTemplateArgument ( 1 ) .( Type ) .getUnderlyingType ( ) }
93+ }
94+
95+ private class StdIstreamBufIterator extends Iterator , Class {
96+ StdIstreamBufIterator ( ) { this .hasQualifiedName ( [ "std" , "bsl" ] , "istreambuf_iterator" ) }
97+
98+ override Type getValueType ( ) { result = this .getTemplateArgument ( 1 ) .( Type ) .getUnderlyingType ( ) }
99+ }
100+
101+ private class StdIstreambufIteratorConstructor extends Constructor , SideEffectFunction ,
102+ AliasFunction
103+ {
104+ StdIstreambufIteratorConstructor ( ) { this .getDeclaringType ( ) instanceof StdIstreamBufIterator }
105+
106+ override predicate parameterNeverEscapes ( int index ) { index = - 1 }
107+
108+ override predicate parameterEscapesOnlyViaReturn ( int index ) { none ( ) }
109+
110+ override predicate hasOnlySpecificReadSideEffects ( ) { any ( ) }
111+
112+ override predicate hasOnlySpecificWriteSideEffects ( ) { any ( ) }
113+
114+ override predicate hasSpecificWriteSideEffect ( ParameterIndex i , boolean buffer , boolean mustWrite ) {
115+ i = - 1 and buffer = false and mustWrite = true
116+ }
117+
118+ override predicate hasSpecificReadSideEffect ( ParameterIndex i , boolean buffer ) {
119+ this .getParameter ( i ) .getUnspecifiedType ( ) instanceof ReferenceType and
120+ buffer = false
121+ }
122+ }
123+
89124/**
90125 * Gets the `FunctionInput` corresponding to an iterator parameter to
91126 * user-defined operator `op`, at `index`.
@@ -579,31 +614,51 @@ private class IteratorAssignmentMemberOperatorModel extends IteratorAssignmentMe
579614 override predicate parameterEscapesOnlyViaReturn ( int index ) { index = - 1 }
580615}
581616
617+ private string beginName ( ) {
618+ result = [ "begin" , "cbegin" , "rbegin" , "crbegin" , "before_begin" , "cbefore_begin" ]
619+ }
620+
582621/**
583622 * A `begin` member function, or a related function, that returns an iterator.
584623 */
585- class BeginFunction extends MemberFunction {
624+ class BeginFunction extends Function {
586625 BeginFunction ( ) {
587- this .hasName ( [ "begin" , "cbegin" , "rbegin" , "crbegin" , "before_begin" , "cbefore_begin" ] ) and
588- this .getType ( ) .getUnspecifiedType ( ) instanceof Iterator
626+ this .getUnspecifiedType ( ) instanceof Iterator and
627+ (
628+ this .hasName ( beginName ( ) ) and
629+ this instanceof MemberFunction
630+ or
631+ this .hasGlobalOrStdOrBslName ( beginName ( ) ) and
632+ not this instanceof MemberFunction and
633+ this .getNumberOfParameters ( ) = 1
634+ )
589635 }
590636}
591637
638+ private string endName ( ) { result = [ "end" , "cend" , "rend" , "crend" ] }
639+
592640/**
593641 * An `end` member function, or a related function, that returns an iterator.
594642 */
595- class EndFunction extends MemberFunction {
643+ class EndFunction extends Function {
596644 EndFunction ( ) {
597- this .hasName ( [ "end" , "cend" , "rend" , "crend" ] ) and
598- this .getType ( ) .getUnspecifiedType ( ) instanceof Iterator
645+ this .getUnspecifiedType ( ) instanceof Iterator and
646+ (
647+ this .hasName ( endName ( ) ) and
648+ this instanceof MemberFunction
649+ or
650+ this .hasGlobalOrStdOrBslName ( endName ( ) ) and
651+ this instanceof MemberFunction and
652+ this .getNumberOfParameters ( ) = 1
653+ )
599654 }
600655}
601656
602657/**
603658 * A `begin` or `end` member function, or a related member function, that
604659 * returns an iterator.
605660 */
606- class BeginOrEndFunction extends MemberFunction {
661+ class BeginOrEndFunction extends Function {
607662 BeginOrEndFunction ( ) {
608663 this instanceof BeginFunction or
609664 this instanceof EndFunction
0 commit comments