Index: clang/lib/StaticAnalyzer/Checkers/IteratorModeling.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/IteratorModeling.cpp +++ clang/lib/StaticAnalyzer/Checkers/IteratorModeling.cpp @@ -88,7 +88,8 @@ check::LiveSymbols, check::DeadSymbols> { using AdvanceFn = void (IteratorModeling::*)(CheckerContext &, const Expr *, - SVal, SVal, SVal) const; + SVal, SVal, SVal, const Expr *, + const Expr *) const; void handleOverloadedOperator(CheckerContext &C, const CallEvent &Call, OverloadedOperatorKind Op) const; @@ -101,24 +102,28 @@ void processComparison(CheckerContext &C, ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2, SVal RetVal, OverloadedOperatorKind Op) const; - void handleIncrement(CheckerContext &C, SVal RetVal, - SVal Iter, bool Postfix) const; - void handleDecrement(CheckerContext &C, SVal RetVal, - SVal Iter, bool Postfix) const; + void handleIncrement(CheckerContext &C, SVal RetVal, SVal Iter, + const Expr *ItEx, bool Postfix) const; + void handleDecrement(CheckerContext &C, SVal RetVal, SVal Iter, + const Expr *ItEx, bool Postfix) const; void handleRandomIncrOrDecr(CheckerContext &C, const Expr *CE, - OverloadedOperatorKind Op, - SVal RetVal, SVal LHS, - SVal RHS) const; + OverloadedOperatorKind Op, SVal RetVal, SVal LHS, + SVal RHS, const Expr *LHSEx, + const Expr *RHSEx = nullptr) const; void handlePtrIncrOrDecr(CheckerContext &C, const Expr *Iterator, - OverloadedOperatorKind OK, SVal Offset) const; - void handleAdvance(CheckerContext &C, const Expr *CE, SVal RetVal, - SVal Iter, SVal Amount) const; - void handlePrev(CheckerContext &C, const Expr *CE, SVal RetVal, - SVal Iter, SVal Amount) const; - void handleNext(CheckerContext &C, const Expr *CE, SVal RetVal, - SVal Iter, SVal Amount) const; + OverloadedOperatorKind Op, SVal Amount, + const Expr *AmEx) const; + void handleAdvance(CheckerContext &C, const Expr *CE, SVal RetVal, SVal Iter, + SVal Amount, const Expr *ItEx, const Expr *AmEx) const; + void handlePrev(CheckerContext &C, const Expr *CE, SVal RetVal, SVal Iter, + SVal Amount, const Expr *ItEx, const Expr *AmEx) const; + void handleNext(CheckerContext &C, const Expr *CE, SVal RetVal, SVal Iter, + SVal Amount, const Expr *ItEx, const Expr *AmEx) const; void assignToContainer(CheckerContext &C, const Expr *CE, SVal RetVal, const MemRegion *Cont) const; + const NoteTag *getChangeTag(CheckerContext &C, StringRef Text, + const Expr *ItEx, int64_t Amount = 0, + const Expr *AmEx = nullptr) const; bool noChangeInAdvance(CheckerContext &C, SVal Iter, const Expr *CE) const; void printState(raw_ostream &Out, ProgramStateRef State, const char *NL, const char *Sep) const override; @@ -256,7 +261,7 @@ auto &SVB = C.getSValBuilder(); handlePtrIncrOrDecr(C, UO->getSubExpr(), isIncrementOperator(OK) ? OO_Plus : OO_Minus, - SVB.makeArrayIndex(1)); + SVB.makeArrayIndex(1), nullptr); } void IteratorModeling::checkPostStmt(const BinaryOperator *BO, @@ -274,7 +279,8 @@ if (!BO->getRHS()->getType()->isIntegralOrEnumerationType()) return; handlePtrIncrOrDecr(C, BO->getLHS(), - BinaryOperator::getOverloadedOperator(OK), RVal); + BinaryOperator::getOverloadedOperator(OK), RVal, + BO->getRHS()); } } @@ -350,7 +356,9 @@ if (Call.getNumArgs() >= 1 && Call.getArgExpr(0)->getType()->isIntegralOrEnumerationType()) { handleRandomIncrOrDecr(C, OrigExpr, Op, getReturnIterator(Call), - InstCall->getCXXThisVal(), Call.getArgSVal(0)); + InstCall->getCXXThisVal(), Call.getArgSVal(0), + InstCall->getCXXThisExpr(), + Call.getArgExpr(0)); return; } } else { @@ -358,29 +366,32 @@ Call.getArgExpr(1)->getType()->isIntegralOrEnumerationType()) { SVal Arg0 = getIteratorArg(Call, 0, C.blockCount()); handleRandomIncrOrDecr(C, OrigExpr, Op, getReturnIterator(Call), Arg0, - Call.getArgSVal(1)); + Call.getArgSVal(1), InstCall->getCXXThisExpr(), + Call.getArgExpr(0)); return; } } } else if (isIncrementOperator(Op)) { if (const auto *InstCall = dyn_cast(&Call)) { handleIncrement(C, getReturnIterator(Call), InstCall->getCXXThisVal(), - Call.getNumArgs()); + InstCall->getCXXThisExpr(), Call.getNumArgs()); return; } SVal Arg0 = getIteratorArg(Call, 0, C.blockCount()); - handleIncrement(C, getReturnIterator(Call), Arg0, Call.getNumArgs()); + handleIncrement(C, getReturnIterator(Call), Arg0, Call.getArgExpr(0), + Call.getNumArgs()); return; } else if (isDecrementOperator(Op)) { if (const auto *InstCall = dyn_cast(&Call)) { handleDecrement(C, getReturnIterator(Call), InstCall->getCXXThisVal(), - Call.getNumArgs()); + InstCall->getCXXThisExpr(), Call.getNumArgs()); return; } SVal Arg0 = getIteratorArg(Call, 0, C.blockCount()); - handleDecrement(C, getReturnIterator(Call), Arg0, Call.getNumArgs()); + handleDecrement(C, getReturnIterator(Call), Arg0, Call.getArgExpr(0), + Call.getNumArgs()); return; } } @@ -393,7 +404,8 @@ SVal Arg0 = getIteratorArg(Call, 0, C.blockCount()); if (!C.wasInlined) { (this->**Handler)(C, OrigExpr, getReturnIterator(Call), Arg0, - Call.getArgSVal(1)); + Call.getArgSVal(1), Call.getArgExpr(0), + Call.getArgExpr(1)); return; } @@ -404,7 +416,8 @@ if (IdInfo->getName() == "advance") { if (noChangeInAdvance(C, Arg0, OrigExpr)) { (this->**Handler)(C, OrigExpr, getReturnIterator(Call), Arg0, - Call.getArgSVal(1)); + Call.getArgSVal(1), Call.getArgExpr(0), + Call.getArgExpr(1)); } } } @@ -499,7 +512,8 @@ } void IteratorModeling::handleIncrement(CheckerContext &C, SVal RetVal, - SVal Iter, bool Postfix) const { + SVal Iter, const Expr *ItEx, + bool Postfix) const { // Increment the symbolic expressions which represents the position of the // iterator auto State = C.getState(); @@ -519,13 +533,15 @@ assert(NewPos && "Iterator should have position after successful advancement"); + const NoteTag *ChangeTag = getChangeTag(C, "incremented", ItEx, 1); State = setIteratorPosition(State, Iter, *NewPos); State = setIteratorPosition(State, RetVal, Postfix ? *Pos : *NewPos); - C.addTransition(State); + C.addTransition(State, ChangeTag); } void IteratorModeling::handleDecrement(CheckerContext &C, SVal RetVal, - SVal Iter, bool Postfix) const { + SVal Iter, const Expr *ItEx, + bool Postfix) const { // Decrement the symbolic expressions which represents the position of the // iterator auto State = C.getState(); @@ -545,16 +561,17 @@ assert(NewPos && "Iterator should have position after successful advancement"); + const NoteTag *ChangeTag = getChangeTag(C, "decremented", ItEx, 1); State = setIteratorPosition(State, Iter, *NewPos); State = setIteratorPosition(State, RetVal, Postfix ? *Pos : *NewPos); - C.addTransition(State); + C.addTransition(State, ChangeTag); } -void IteratorModeling::handleRandomIncrOrDecr(CheckerContext &C, - const Expr *CE, +void IteratorModeling::handleRandomIncrOrDecr(CheckerContext &C, const Expr *CE, OverloadedOperatorKind Op, SVal RetVal, SVal Iter, - SVal Amount) const { + SVal Amount, const Expr *ItEx, + const Expr *AmEx) const { // Increment or decrement the symbolic expressions which represents the // position of the iterator auto State = C.getState(); @@ -582,8 +599,18 @@ assert(NewPos && "Iterator should have position after successful advancement"); + auto &SVB = State->getStateManager().getSValBuilder(); + int64_t ChangeVal = SVB.getKnownValue(State, *AmountVal)->getExtValue(); + StringRef ChangeText = + ((Op == OO_Plus || Op == OO_PlusEqual) != (ChangeVal <= 0)) ? + "incremented" : "decremented"; + if (!ChangeVal) + ChangeText = "unchanged"; + + const NoteTag *ChangeTag = getChangeTag(C, ChangeText, ItEx, + std::abs(ChangeVal), AmEx); State = setIteratorPosition(State, TgtVal, *NewPos); - C.addTransition(State); + C.addTransition(State, ChangeTag); } else { assignToContainer(C, CE, TgtVal, Pos->getContainer()); } @@ -591,9 +618,10 @@ void IteratorModeling::handlePtrIncrOrDecr(CheckerContext &C, const Expr *Iterator, - OverloadedOperatorKind OK, - SVal Offset) const { - if (!Offset.getAs()) + OverloadedOperatorKind Op, + SVal Amount, + const Expr *AmEx) const { + if (!Amount.getAs()) return; QualType PtrType = Iterator->getType(); @@ -609,25 +637,36 @@ return; SVal NewVal; - if (OK == OO_Plus || OK == OO_PlusEqual) { - NewVal = State->getLValue(ElementType, Offset, OldVal); + if (Op == OO_Plus || Op == OO_PlusEqual) { + NewVal = State->getLValue(ElementType, Amount, OldVal); } else { auto &SVB = C.getSValBuilder(); - SVal NegatedOffset = SVB.evalMinus(Offset.castAs()); - NewVal = State->getLValue(ElementType, NegatedOffset, OldVal); + SVal NegatedAmount = SVB.evalMinus(Amount.castAs()); + NewVal = State->getLValue(ElementType, NegatedAmount, OldVal); } // `AdvancedState` is a state where the position of `Old` is advanced. We // only need this state to retrieve the new position, but we do not want // ever to change the position of `OldVal`. - auto AdvancedState = advancePosition(State, OldVal, OK, Offset); + auto AdvancedState = advancePosition(State, OldVal, Op, Amount); if (AdvancedState) { const IteratorPosition *NewPos = getIteratorPosition(AdvancedState, OldVal); assert(NewPos && "Iterator should have position after successful advancement"); + auto &SVB = State->getStateManager().getSValBuilder(); + int64_t ChangeVal = SVB.getKnownValue(State, Amount)->getExtValue(); + StringRef ChangeText = + ((Op == OO_Plus || Op == OO_PlusEqual) != (ChangeVal <= 0)) ? + "incremented" : "decremented"; + if (!ChangeVal) + ChangeText = "unchanged"; + + const NoteTag *ChangeTag = getChangeTag(C, ChangeText, Iterator, + std::abs(ChangeVal), AmEx); + ProgramStateRef NewState = setIteratorPosition(State, NewVal, *NewPos); - C.addTransition(NewState); + C.addTransition(NewState, ChangeTag); } else { assignToContainer(C, Iterator, NewVal, OldPos->getContainer()); } @@ -635,20 +674,21 @@ void IteratorModeling::handleAdvance(CheckerContext &C, const Expr *CE, SVal RetVal, SVal Iter, - SVal Amount) const { - handleRandomIncrOrDecr(C, CE, OO_PlusEqual, RetVal, Iter, Amount); + SVal Amount, const Expr *ItEx, + const Expr *AmEx) const { + handleRandomIncrOrDecr(C, CE, OO_PlusEqual, RetVal, Iter, Amount, ItEx, AmEx); } void IteratorModeling::handlePrev(CheckerContext &C, const Expr *CE, - SVal RetVal, SVal Iter, - SVal Amount) const { - handleRandomIncrOrDecr(C, CE, OO_Minus, RetVal, Iter, Amount); + SVal RetVal, SVal Iter, SVal Amount, + const Expr *ItEx, const Expr *AmEx) const { + handleRandomIncrOrDecr(C, CE, OO_Minus, RetVal, Iter, Amount, ItEx, AmEx); } void IteratorModeling::handleNext(CheckerContext &C, const Expr *CE, - SVal RetVal, SVal Iter, - SVal Amount) const { - handleRandomIncrOrDecr(C, CE, OO_Plus, RetVal, Iter, Amount); + SVal RetVal, SVal Iter, SVal Amount, + const Expr *ItEx, const Expr *AmEx) const { + handleRandomIncrOrDecr(C, CE, OO_Plus, RetVal, Iter, Amount, ItEx, AmEx); } void IteratorModeling::assignToContainer(CheckerContext &C, const Expr *CE, @@ -693,6 +733,34 @@ return PosBefore->getOffset() == PosAfter->getOffset(); } +const NoteTag *IteratorModeling::getChangeTag(CheckerContext &C, StringRef Text, + const Expr *ItEx, int64_t Amount, + const Expr *AmEx) const { + if (const auto *CCE = dyn_cast(ItEx)) { + ItEx = CCE->getArg(0); + } + + StringRef Name; + if (const auto *DRE = dyn_cast(ItEx->IgnoreParenCasts())) { + Name = DRE->getDecl()->getName(); + } + + return C.getNoteTag( + [Text, Name, Amount, AmEx](PathSensitiveBugReport &BR) -> std::string { + SmallString<256> Msg; + llvm::raw_svector_ostream Out(Msg); + Out << "Iterator " << (!Name.empty() ? ("'" + Name.str() + "' ") : "") + << Text; + if (Amount) { + Out << " by " << Amount; + } + if (AmEx) { + bugreporter::trackExpressionValue(BR.getErrorNode(), AmEx, BR); + } + return std::string(Out.str()); + }); +} + void IteratorModeling::printState(raw_ostream &Out, ProgramStateRef State, const char *NL, const char *Sep) const { auto SymbolMap = State->get(); Index: clang/test/Analysis/iterator-modeling.cpp =================================================================== --- clang/test/Analysis/iterator-modeling.cpp +++ clang/test/Analysis/iterator-modeling.cpp @@ -1,14 +1,42 @@ -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=false %s -verify -analyzer-config display-checker-name=false - -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 %s -verify -analyzer-config display-checker-name=false - -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 -DSTD_ADVANCE_INLINE_LEVEL=0 %s -verify -analyzer-config display-checker-name=false - -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 -DSTD_ADVANCE_INLINE_LEVEL=1 %s -verify -analyzer-config display-checker-name=false - -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 -DSTD_ADVANCE_INLINE_LEVEL=2 %s -verify -analyzer-config display-checker-name=false - -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorModeling,debug.ExprInspection -analyzer-config aggressive-binary-operation-simplification=true %s 2>&1 | FileCheck %s +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection\ +// RUN: -analyzer-config aggressive-binary-operation-simplification=true\ +// RUN: -analyzer-config c++-container-inlining=false -analyzer-output=text %s\ +// RUN: -analyzer-config display-checker-name=false\ +// RUN: -verify + +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection\ +// RUN: -analyzer-config aggressive-binary-operation-simplification=true\ +// RUN: -analyzer-config c++-container-inlining=true -DINLINE=1\ +// RUN: -analyzer-config display-checker-name=false\ +// RUN: -analyzer-output=text %s -verify + +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection\ +// RUN: -analyzer-config aggressive-binary-operation-simplification=true\ +// RUN: -analyzer-config c++-container-inlining=true -DINLINE=1\ +// RUN: -analyzer-config display-checker-name=false\ +// RUN: -DSTD_ADVANCE_INLINE_LEVEL=0 -analyzer-output=text %s -verify + +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection\ +// RUN: -analyzer-config aggressive-binary-operation-simplification=true\ +// RUN: -analyzer-config c++-container-inlining=true -DINLINE=1\ +// RUN: -analyzer-config display-checker-name=false\ +// RUN: -DSTD_ADVANCE_INLINE_LEVEL=1 -analyzer-output=text %s -verify + +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,debug.DebugIteratorModeling,debug.ExprInspection\ +// RUN: -analyzer-config aggressive-binary-operation-simplification=true\ +// RUN: -analyzer-config c++-container-inlining=true -DINLINE=1\ +// RUN: -analyzer-config display-checker-name=false\ +// RUN: -DSTD_ADVANCE_INLINE_LEVEL=2 -analyzer-output=text %s -verify + +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorModeling,debug.ExprInspection\ +// RUN: -analyzer-config aggressive-binary-operation-simplification=true %s\ +// RUN: 2>&1 | FileCheck %s #include "Inputs/system-header-simulator-cxx.h" @@ -33,8 +61,10 @@ auto i = v.begin(); clang_analyzer_eval(clang_analyzer_iterator_container(i) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.begin(){{$}}}} + // expected-note@-1{{$v.begin()}} if (i != v.begin()) { clang_analyzer_warnIfReached(); @@ -45,8 +75,10 @@ auto i = v.end(); clang_analyzer_eval(clang_analyzer_iterator_container(i) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.end(){{$}}}} + // expected-note@-1{{$v.end()}} if (i != v.end()) { clang_analyzer_warnIfReached(); @@ -58,10 +90,12 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - auto j = ++i; + auto j = ++i; // expected-note 2{{Iterator 'i' incremented by 1}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.begin() + 1{{$}}}} + // expected-note@-1{{$v.begin() + 1}} clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$v.begin() + 1{{$}}}} + // expected-note@-1{{$v.begin() + 1}} } void prefix_decrement(const std::vector &v) { @@ -69,10 +103,12 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - auto j = --i; + auto j = --i; // expected-note 2{{Iterator 'i' decremented by 1}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.end() - 1{{$}}}} + // expected-note@-1{{$v.end() - 1}} clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$v.end() - 1{{$}}}} + // expected-note@-1{{$v.end() - 1}} } void postfix_increment(const std::vector &v) { @@ -80,10 +116,12 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - auto j = i++; + auto j = i++; // expected-note 2{{Iterator 'i' incremented by 1}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.begin() + 1{{$}}}} + // expected-note@-1{{$v.begin() + 1}} clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$v.begin(){{$}}}} + // expected-note@-1{{$v.begin()}} } void postfix_decrement(const std::vector &v) { @@ -91,10 +129,12 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - auto j = i--; + auto j = i--; // expected-note 2{{Iterator 'i' decremented by 1}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.end() - 1{{$}}}} + // expected-note@-1{{$v.end() - 1}} clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$v.end(){{$}}}} + // expected-note@-1{{$v.end()}} } void plus_equal(const std::vector &v) { @@ -102,9 +142,10 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - i += 2; + i += 2; // expected-note{{Iterator 'i' incremented by 2}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.begin() + 2{{$}}}} + // expected-note@-1{{$v.begin() + 2}} } void plus_equal_negative(const std::vector &v) { @@ -112,9 +153,21 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - i += -2; + i += -2; // expected-note{{Iterator 'i' decremented by 2}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.end() - 2{{$}}}} + // expected-note@-1{{$v.end() - 2}} +} + +void plus_equal_zero(const std::vector &v) { + auto i = v.end(); + + clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); + + i += 0; // expected-note{{Iterator 'i' unchanged}} + + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$v.end()}} + // expected-note@-1{{$v.end()}} } void minus_equal(const std::vector &v) { @@ -122,9 +175,10 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - i -= 2; + i -= 2; // expected-note{{Iterator 'i' decremented by 2}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.end() - 2{{$}}}} + // expected-note@-1{{$v.end() - 2}} } void minus_equal_negative(const std::vector &v) { @@ -132,9 +186,21 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - i -= -2; + i -= -2; // expected-note{{Iterator 'i' incremented by 2}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.begin() + 2{{$}}}} + // expected-note@-1{{$v.begin() + 2}} +} + +void minus_equal_zero(const std::vector &v) { + auto i = v.begin(); + + clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); + + i -= 0; // expected-note{{Iterator 'i' unchanged}} + + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$v.begin()}} + // expected-note@-1{{$v.begin()}} } void copy(const std::vector &v) { @@ -145,8 +211,11 @@ auto i2 = i1; clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$v.end(){{$}}}} + // expected-note@-1{{$v.end()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.end(){{$}}}} + // expected-note@-1{{$v.end()}} } void plus(const std::vector &v) { @@ -154,11 +223,16 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - auto i2 = i1 + 2; + auto i2 = i1 + 2; // expected-note 4{{Iterator 'i1' incremented by 2}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re{{$v.begin(){{$}}}} + // expected-note@-1{{$v.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re{{$v.begin() + 2{{$}}}} + // expected-note@-1{{$v.begin() + 2}} + clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning{{$v.begin() + 2}} + // expected-note@-1{{$v.begin() + 2}} } void plus_negative(const std::vector &v) { @@ -166,11 +240,27 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - auto i2 = i1 + (-2); + auto i2 = i1 + (-2); // expected-note 3{{Iterator 'i1' decremented by 2}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$v.end(){{$}}}} + // expected-note@-1{{$v.end()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.end() - 2{{$}}}} + // expected-note@-1{{$v.end() - 2}} +} + +void plus_zero(const std::vector &v) { + auto i1 = v.begin(); + + clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); + + auto i2 = i1 + 0; // expected-note 2{{Iterator 'i1' unchanged}} + + clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.begin(){{$}}}} + // expected-note@-1{{$v.begin()}} } void minus(const std::vector &v) { @@ -178,11 +268,14 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - auto i2 = i1 - 2; + auto i2 = i1 - 2; // expected-note 3{{Iterator 'i1' decremented by 2}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$v.end(){{$}}}} + // expected-note@-1{{$v.end()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.end() - 2{{$}}}} + // expected-note@-1{{$v.end() - 2}} } void minus_negative(const std::vector &v) { @@ -190,11 +283,27 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - auto i2 = i1 - (-2); + auto i2 = i1 - (-2); // expected-note 3{{Iterator 'i1' incremented by 2}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$v.begin(){{$}}}} + // expected-note@-1{{$v.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.begin() + 2{{$}}}} + // expected-note@-1{{$v.begin() + 2}} +} + +void minus_zero(const std::vector &v) { + auto i1 = v.begin(); + + clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); + + auto i2 = i1 - 0; // expected-note 2{{Iterator 'i1' unchanged}} + + clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &v); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.begin(){{$}}}} + // expected-note@-1{{$v.begin()}} } void copy_and_increment1(const std::vector &v) { @@ -203,10 +312,12 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); auto i2 = i1; - ++i1; + ++i1; // expected-note 2{{Iterator 'i1' incremented by 1}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$v.begin() + 1{{$}}}} + // expected-note@-1{{$v.begin() + 1}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.begin(){{$}}}} + // expected-note@-1{{$v.begin()}} } void copy_and_increment2(const std::vector &v) { @@ -215,10 +326,12 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); auto i2 = i1; - ++i2; + ++i2; // expected-note 2{{Iterator 'i2' incremented by 1}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$v.begin(){{$}}}} + // expected-note@-1{{$v.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.begin() + 1{{$}}}} + // expected-note@-1{{$v.begin() + 1}} } void copy_and_decrement1(const std::vector &v) { @@ -227,10 +340,12 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); auto i2 = i1; - --i1; + --i1; // expected-note 2{{Iterator 'i1' decremented by 1}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$v.end() - 1{{$}}}} + // expected-note@-1{{$v.end() - 1}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.end(){{$}}}} + // expected-note@-1{{$v.end()}} } void copy_and_decrement2(const std::vector &v) { @@ -239,10 +354,12 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); auto i2 = i1; - --i2; + --i2; // expected-note 2{{Iterator 'i2' decremented by 1}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$v.end(){{$}}}} + // expected-note@-1{{$v.end()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$v.end() - 1{{$}}}} + // expected-note@-1{{$v.end() - 1}} } /// std::advance(), std::prev(), std::next() @@ -252,9 +369,17 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - std::advance(i, -1); + std::advance(i, -1); // expected-note 0-1{{Iterator 'i' decremented by 1}} + // expected-note@-1 0-1{{Calling 'advance}} + // expected-note@-2 0-1{{Passing the value -1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Calling '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Passing the value -1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:776 0-1{{Iterator 'it' decremented by 1}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Returning from '__advance}} + // expected-note@-7 0-1{{Returning from 'advance}} clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.end() - 1{{$}}}} + // expected-note@-1{{$v.end() - 1}} } void std_advance_plus(const std::vector &v) { @@ -262,9 +387,17 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - std::advance(i, 1); + std::advance(i, 1); // expected-note 0-1{{Iterator 'i' incremented by 1}} + // expected-note@-1 0-1{{Calling 'advance}} + // expected-note@-2 0-1{{Passing the value 1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Calling '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Passing the value 1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:776 0-1{{Iterator 'it' incremented by 1}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Returning from '__advance}} + // expected-note@-7 0-1{{Returning from 'advance}} - clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$v.begin() + 1{{$}}}} + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$v.begin() + 1}} + // expected-note@-1{{$v.begin() + 1}} } void std_prev(const std::vector &v) { @@ -272,9 +405,20 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - auto j = std::prev(i); + auto j = std::prev(i); // expected-note 0-1{{Iterator 'i' decremented by 1}} + // expected-note@-1 0-1{{Calling 'prev}} + // expected-note@Inputs/system-header-simulator-cxx.h:801 0-1{{Iterator 'it' decremented by 1}} + // expected-note@Inputs/system-header-simulator-cxx.h:801 0-1{{Calling 'advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:801 0-1{{Passing the value -1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Calling '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Passing the value -1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:776 0-1{{Iterator 'it' decremented by 1}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Returning from '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:801 0-1{{Returning from 'advance}} + // expected-note@-10 0-1{{Returning from 'prev}} - clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$v.end() - 1{{$}}}} + clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning{{$v.end() - 1}} + // expected-note@-1{{$v.end() - 1}} } void std_prev2(const std::vector &v) { @@ -282,9 +426,20 @@ clang_analyzer_denote(clang_analyzer_container_end(v), "$v.end()"); - auto j = std::prev(i, 2); + auto j = std::prev(i, 2); // expected-note 0-1{{Iterator 'i' decremented by 2}} + // expected-note@-1 0-1{{Calling 'prev}} + // expected-note@Inputs/system-header-simulator-cxx.h:801 0-1{{Iterator 'it' decremented by 2}} + // expected-note@Inputs/system-header-simulator-cxx.h:801 0-1{{Calling 'advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:801 0-1{{Passing the value -2 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Calling '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Passing the value -2 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:776 0-1{{Iterator 'it' decremented by 2}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Returning from '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:801 0-1{{Returning from 'advance}} + // expected-note@-10 0-1{{Returning from 'prev}} - clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$v.end() - 2{{$}}}} + clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning{{$v.end() - 2}} + // expected-note@-1{{$v.end() - 2}} } void std_next(const std::vector &v) { @@ -292,9 +447,21 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - auto j = std::next(i); + auto j = std::next(i); // expected-note 0-1{{Iterator 'i' incremented by 1}} + // expected-note@-1 0-1{{Calling 'next}} + // expected-note@-2 0-1{{Passing the value 1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:815 0-1{{Iterator 'it' incremented by 1}} + // expected-note@Inputs/system-header-simulator-cxx.h:815 0-1{{Calling 'advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:815 0-1{{Passing the value 1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Calling '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Passing the value 1 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:776 0-1{{Iterator 'it' incremented by 1}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Returning from '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:815 0-1{{Returning from 'advance}} + // expected-note@-11 0-1{{Returning from 'next}} - clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$v.begin() + 1{{$}}}} + clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning{{$v.begin() + 1}} + // expected-note@-1{{$v.begin() + 1}} } void std_next2(const std::vector &v) { @@ -302,9 +469,21 @@ clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); - auto j = std::next(i, 2); + auto j = std::next(i, 2); // expected-note 0-1{{Iterator 'i' incremented by 2}} + // expected-note@-1 0-1{{Calling 'next}} + // expected-note@-2 0-1{{Passing the value 2 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:815 0-1{{Iterator 'it' incremented by 2}} + // expected-note@Inputs/system-header-simulator-cxx.h:815 0-1{{Calling 'advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:815 0-1{{Passing the value 2 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Calling '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Passing the value 2 via 2nd parameter 'n'}} + // expected-note@Inputs/system-header-simulator-cxx.h:776 0-1{{Iterator 'it' incremented by 2}} + // expected-note@Inputs/system-header-simulator-cxx.h:788 0-1{{Returning from '__advance}} + // expected-note@Inputs/system-header-simulator-cxx.h:815 0-1{{Returning from 'advance}} + // expected-note@-11 0-1{{Returning from 'next}} - clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$v.begin() + 2{{$}}}} + clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning{{$v.begin() + 2}} + // expected-note@-1{{$v.begin() + 2}} } //////////////////////////////////////////////////////////////////////////////// @@ -317,88 +496,120 @@ void list_copy_assignment(std::list &L1, const std::list &L2) { auto i0 = L1.cbegin(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} L1 = L2; - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void vector_copy_assignment(std::vector &V1, const std::vector &V2) { auto i0 = V1.cbegin(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} V1 = V2; - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void deque_copy_assignment(std::deque &D1, const std::deque &D2) { auto i0 = D1.cbegin(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} D1 = D2; - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void forward_list_copy_assignment(std::forward_list &FL1, const std::forward_list &FL2) { auto i0 = FL1.cbegin(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} FL1 = FL2; - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } // Move void list_move_assignment(std::list &L1, std::list &L2) { auto i0 = L1.cbegin(), i1 = L2.cbegin(), i2 = --L2.cend(), i3 = L2.cend(); + // expected-note@-1 7{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L2), "$L2.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L2), "$L2.end()"); L1 = std::move(L2); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); //expected-warning{{TRUE}} FIXME: Should be FALSE. + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); // expected-warning{{TRUE}} FIXME: Should be FALSE. + // expected-note@-1{{TRUE}} FIXME: Should be FALSE. clang_analyzer_eval(clang_analyzer_iterator_container(i1) == &L1); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &L1); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L2.begin(){{$}}}} + // expected-note@-1{{$L2.begin()}} } void vector_move_assignment(std::vector &V1, std::vector &V2) { auto i0 = V1.cbegin(), i1 = V2.cbegin(), i2 = --V2.cend(), i3 = V2.cend(); + // expected-note@-1 7{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V2), "$V2.begin()"); V1 = std::move(V2); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); //expected-warning{{TRUE}} FIXME: Should be FALSE. + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); // expected-warning{{TRUE}} FIXME: Should be FALSE. + // expected-note@-1{{TRUE}} FIXME: Should be FALSE. clang_analyzer_eval(clang_analyzer_iterator_container(i1) == &V1); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &V1); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$V2.begin(){{$}}}} + // expected-note@-1{{$V2.begin()}} } void deque_move_assignment(std::deque &D1, std::deque &D2) { auto i0 = D1.cbegin(), i1 = D2.cbegin(), i2 = --D2.cend(), i3 = D2.cend(); + // expected-note@-1 7{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D2), "$D2.begin()"); D1 = std::move(D2); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); //expected-warning{{TRUE}} FIXME: Should be FALSE. + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); // expected-warning{{TRUE}} FIXME: Should be FALSE. + // expected-note@-1{{TRUE}} FIXME: Should be FALSE. clang_analyzer_eval(clang_analyzer_iterator_container(i1) == &D1); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &D1); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$D2.begin(){{$}}}} + // expected-note@-1{{$D2.begin()}} } void forward_list_move_assignment(std::forward_list &FL1, @@ -409,13 +620,18 @@ FL1 = std::move(FL2); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} FIXME: Should be FALSE. + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} FIXME: Should be FALSE. + // expected-note@-1{{TRUE}} FIXME: Should be FALSE. clang_analyzer_eval(clang_analyzer_iterator_container(i1) == &FL1); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$FL2.begin(){{$}}}} + // expected-note@-1{{$FL2.begin()}} } @@ -433,29 +649,37 @@ void list_assign(std::list &L, int n) { auto i0 = L.cbegin(), i1 = L.cend(); L.assign(10, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void vector_assign(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = V.cend(); V.assign(10, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void deque_assign(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = D.cend(); D.assign(10, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void forward_list_assign(std::forward_list &FL, int n) { auto i0 = FL.cbegin(), i1 = FL.cend(); FL.assign(10, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } /// clear() @@ -465,30 +689,38 @@ void list_clear(std::list &L) { auto i0 = L.cbegin(), i1 = L.cend(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} L.clear(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void vector_clear(std::vector &V) { auto i0 = V.cbegin(), i1 = V.cend(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} V.clear(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void deque_clear(std::deque &D) { auto i0 = D.cbegin(), i1 = D.cend(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} D.clear(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } void forward_list_clear(std::forward_list &FL) { auto i0 = FL.cbegin(), i1 = FL.cend(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} FL.clear(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } /// push_back() @@ -502,37 +734,50 @@ void list_push_back(std::list &L, int n) { auto i0 = L.cbegin(), i1 = --L.cend(), i2 = L.cend(); + // expected-note@-1 6{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); L.push_back(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end() - 1{{$}}}} + // expected-note@-1{{$L.end() - 1}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} FIXME: Should be $L.end() + 1 + // expected-note@-1{{$L.end()}} FIXME: Should be $L.end() + 1 } /// std::vector-like containers: The past-the-end iterator is invalidated. void vector_push_back(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = --V.cend(), i2 = V.cend(); + // expected-note@-1 5{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); V.push_back(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$V.end() - 1{{$}}}} + // expected-note@-1{{$V.end() - 1}} } /// std::deque-like containers: All iterators, including the past-the-end @@ -540,15 +785,19 @@ void deque_push_back(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); D.push_back(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } /// emplace_back() @@ -562,37 +811,50 @@ void list_emplace_back(std::list &L, int n) { auto i0 = L.cbegin(), i1 = --L.cend(), i2 = L.cend(); + // expected-note@-1 6{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); L.emplace_back(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end() - 1{{$}}}} + // expected-note@-1{{$L.end()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} FIXME: Should be $L.end() + 1 + // expected-note@-1{{$L.end()}} FIXME: Should be $L.end() + 1 } /// std::vector-like containers: The past-the-end iterator is invalidated. void vector_emplace_back(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = --V.cend(), i2 = V.cend(); + // expected-note@-1 5{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); V.emplace_back(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$V.end() - 1{{$}}}} + // expected-note@-1{{$V.end() - 1}} } /// std::deque-like containers: All iterators, including the past-the-end @@ -600,15 +862,19 @@ void deque_emplace_back(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); D.emplace_back(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } /// pop_back() @@ -622,18 +888,24 @@ void list_pop_back(std::list &L, int n) { auto i0 = L.cbegin(), i1 = --L.cend(), i2 = L.cend(); + // expected-note@-1 5{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); L.pop_back(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} FIXME: Should be $L.end() - 1 + // expected-note@-1{{$L.end()}} FIXME: Should be $L.end() - 1 } /// std::vector-like containers: Iterators to the last element, as well as the @@ -641,17 +913,22 @@ void vector_pop_back(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = --V.cend(), i2 = V.cend(); + // expected-note@-1 4{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); V.pop_back(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} } /// std::deque-like containers: Iterators to the last element are invalidated. @@ -660,17 +937,22 @@ void deque_pop_back(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 4{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); D.pop_back(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$D.begin(){{$}}}} + // expected-note@-1{{$D.begin()}} } /// push_front() @@ -690,11 +972,15 @@ L.push_front(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } /// std::deque-like containers: All iterators, including the past-the-end @@ -702,15 +988,19 @@ void deque_push_front(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); D.push_front(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } /// std::forward_list-like containers: No iterators are invalidated. @@ -723,11 +1013,15 @@ FL.push_front(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } /// emplace_front() @@ -747,11 +1041,15 @@ L.emplace_front(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } /// std::deque-like containers: All iterators, including the past-the-end @@ -759,15 +1057,19 @@ void deque_emplace_front(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); D.emplace_front(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} } /// std::forward_list-like containers: No iterators are invalidated. @@ -780,11 +1082,15 @@ FL.emplace_front(n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } /// pop_front() @@ -798,18 +1104,24 @@ void list_pop_front(std::list &L, int n) { auto i0 = L.cbegin(), i1 = ++L.cbegin(), i2 = L.cend(); + // expected-note@-1 5{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); L.pop_front(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.begin() + 1{{$}}}} + // expected-note@-1{{$L.begin() + 1}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } /// std::deque-like containers: Iterators to the first element are invalidated. @@ -817,18 +1129,24 @@ void deque_pop_front(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = ++D.cbegin(), i2 = D.cend(); + // expected-note@-1 5{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); D.pop_front(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$D.begin() + 1{{$}}}} + // expected-note@-1{{$D.begin() + 1}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$D.end(){{$}}}} + // expected-note@-1{{$D.end()}} } /// std::forward_list-like containers: Iterators to the first element are @@ -836,18 +1154,24 @@ void forward_list_pop_front(std::list &FL, int n) { auto i0 = FL.cbegin(), i1 = ++FL.cbegin(), i2 = FL.cend(); + // expected-note@-1 5{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(FL), "$FL.begin()"); clang_analyzer_denote(clang_analyzer_container_end(FL), "$FL.end()"); FL.pop_front(); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$FL.begin() + 1{{$}}}} + // expected-note@-1{{$FL.begin() + 1}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } /// insert() @@ -870,30 +1194,41 @@ auto i2 = L.insert(i0, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $L.begin() - 1 clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } void list_insert_behind_begin(std::list &L, int n) { auto i0 = L.cbegin(), i1 = ++L.cbegin(), i2 = L.cend(); + // expected-note@-1 6{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} FIXME: Should be $L.begin() - 1 + // expected-note@-1{{$L.begin()}} FIXME: Should be $L.begin() - 1 clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.begin() + 1{{$}}}} + // expected-note@-1{{$L.begin() + 1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.begin() clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } template Iter return_any_iterator(const Iter &It); @@ -907,49 +1242,69 @@ auto i3 = L.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$i1{{$}}}} + // expected-note@-1{{$i1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i - 1 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } void list_insert_ahead_of_end(std::list &L, int n) { auto i0 = L.cbegin(), i1 = --L.cend(), i2 = L.cend(); + // expected-note@-1 6{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end() - 1{{$}}}} + // expected-note@-1{{$L.end() - 1}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.end() - 2 } void list_insert_end(std::list &L, int n) { auto i0 = L.cbegin(), i1 = --L.cend(), i2 = L.cend(); + // expected-note@-1 6{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.insert(i2, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end() - 1{{$}}}} FIXME: should be $L.end() - 2 + // expected-note@-1{{$L.end() - 1}} FIXME: should be $L.end() - 2 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.end() - 1 } @@ -965,25 +1320,32 @@ auto i2 = V.insert(i0, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $V.begin() - 1 } void vector_insert_behind_begin(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = ++V.cbegin(), i2 = V.cend(); + // expected-note@-1 4{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} FIXME: Should be $V.begin() - 1 + // expected-note@-1{{$V.begin()}} FIXME: Should be $V.begin() - 1 // clang_analyzer_express(clang_analyzer_iterator_position(i3)); // FIXME: expect -warning $V.begin() } @@ -996,44 +1358,59 @@ auto i3 = V.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expecte warning $i1 - 1 } void vector_insert_ahead_of_end(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = --V.cend(), i2 = V.cend(); + // expected-note@-1 4{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $V.end() - 2 } void vector_insert_end(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = --V.cend(), i2 = V.cend(); + // expected-note@-1 5{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.insert(i2, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$V.end() - 1{{$}}}} FIXME: Should be $V.end() - 2 + // expected-note@-1{{$V.end() - 1}} FIXME: Should be $V.end() - 2 // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $V.end() - 1 } @@ -1048,23 +1425,29 @@ auto i2 = D.insert(i0, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $D.begin() - 1 } void deque_insert_behind_begin(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = ++D.cbegin(), i2 = D.cend(); + // expected-note@-1 3{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.begin() - 1 } @@ -1078,39 +1461,50 @@ auto i3 = D.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i1 - 1 } void deque_insert_ahead_of_end(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.insert(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.end() - 2 } void deque_insert_end(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.insert(i2, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.end() - 1 } @@ -1133,30 +1527,41 @@ auto i2 = FL.insert_after(i0, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $FL.begin() + 1 clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } void forward_list_insert_after_behind_begin(std::forward_list &FL, int n) { auto i0 = FL.cbegin(), i1 = ++FL.cbegin(), i2 = FL.cend(); + // expected-note@-1 6{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(FL), "$FL.begin()"); clang_analyzer_denote(clang_analyzer_container_end(FL), "$FL.end()"); auto i3 = FL.insert_after(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$FL.begin() + 1{{$}}}} + // expected-note@-1{{$FL.begin() + 1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $FL.begin() + 2 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } void forward_list_insert_after_unknown(std::forward_list &FL, int n) { @@ -1168,14 +1573,20 @@ auto i3 = FL.insert_after(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$i1{{$}}}} + // expected-note@-1{{$i1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i1 + 1 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } /// emplace() @@ -1198,30 +1609,41 @@ auto i2 = L.emplace(i0, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $L.begin() - 1 clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } void list_emplace_behind_begin(std::list &L, int n) { auto i0 = L.cbegin(), i1 = ++L.cbegin(), i2 = L.cend(); + // expected-note@-1 6{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} FIXME: Should be $L.begin() - 1 + // expected-note@-1{{$L.begin()}} FIXME: Should be $L.begin() - 1 clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.begin() + 1{{$}}}} + // expected-note@-1{{$L.begin() + 1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.begin() clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } template Iter return_any_iterator(const Iter &It); @@ -1235,49 +1657,69 @@ auto i3 = L.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$i1{{$}}}} + // expected-note@-1{{$i1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i - 1 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } void list_emplace_ahead_of_end(std::list &L, int n) { auto i0 = L.cbegin(), i1 = --L.cend(), i2 = L.cend(); + // expected-note@-1 6{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end() - 1{{$}}}} + // expected-note@-1{{$L.end() - 1}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.end() - 2 } void list_emplace_end(std::list &L, int n) { auto i0 = L.cbegin(), i1 = --L.cend(), i2 = L.cend(); + // expected-note@-1 6{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.emplace(i2, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end() - 1{{$}}}} FIXME: should be $L.end() - 2 + // expected-note@-1{{$L.end() - 1}} FIXME: should be $L.end() - 2 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.end() - 1 } @@ -1293,24 +1735,31 @@ auto i2 = V.emplace(i0, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $V.begin() - 1 } void vector_emplace_behind_begin(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = ++V.cbegin(), i2 = V.cend(); + // expected-note@-1 4{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} FIXME: Should be $V.begin() - 1 + // expected-note@-1{{$V.begin()}} FIXME: Should be $V.begin() - 1 // clang_analyzer_express(clang_analyzer_iterator_position(i3)); // FIXME: expect -warning $V.begin() } @@ -1323,44 +1772,59 @@ auto i3 = V.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expecte warning $i1 - 1 } void vector_emplace_ahead_of_end(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = --V.cend(), i2 = V.cend(); + // expected-note@-1 4{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $V.end() - 2 } void vector_emplace_end(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = --V.cend(), i2 = V.cend(); + // expected-note@-1 5{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.emplace(i2, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$V.end() - 1{{$}}}} FIXME: Should be $V.end() - 2 + // expected-note@-1{{$V.end() - 1}} FIXME: Should be $V.end() - 2 // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $V.end() - 1 } @@ -1375,22 +1839,28 @@ auto i2 = D.emplace(i0, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $D.begin() - 1 } void deque_emplace_behind_begin(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = ++D.cbegin(), i2 = D.cend(); + // expected-note@-1 3{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.begin() - 1 } @@ -1403,39 +1873,50 @@ auto i3 = D.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i1 - 1 } void deque_emplace_ahead_of_end(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.emplace(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.end() - 2 } void deque_emplace_end(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.emplace(i2, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.end() - 1 } @@ -1458,31 +1939,42 @@ auto i2 = FL.emplace_after(i0, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $FL.begin() + 1 clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } void forward_list_emplace_after_behind_begin(std::forward_list &FL, int n) { auto i0 = FL.cbegin(), i1 = ++FL.cbegin(), i2 = FL.cend(); + // expected-note@-1 6{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(FL), "$FL.begin()"); clang_analyzer_denote(clang_analyzer_container_end(FL), "$FL.end()"); auto i3 = FL.emplace_after(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$FL.begin() + 1{{$}}}} + // expected-note@-1{{$FL.begin() + 1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $FL.begin() + 2 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } void forward_list_emplace_after_unknown(std::forward_list &FL, int n) { @@ -1494,14 +1986,20 @@ auto i3 = FL.emplace_after(i1, n); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$i1{{$}}}} + // expected-note@-1{{$i1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i1 + 1 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } /// erase() @@ -1519,36 +2017,48 @@ void list_erase_begin(std::list &L) { auto i0 = L.cbegin(), i1 = ++L.cbegin(), i2 = L.cend(); + // expected-note@-1 5{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.erase(i0); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.begin() + 1{{$}}}} + // expected-note@-1{{$L.begin() + 1}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.begin() + 1 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } void list_erase_behind_begin(std::list &L, int n) { auto i0 = L.cbegin(), i1 = ++L.cbegin(), i2 = L.cend(); + // expected-note@-1 5{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} FIXME: Should be $L.begin() + 1 + // expected-note@-1{{$L.begin()}} FIXME: Should be $L.begin() + 1 // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.begin() + 2 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } void list_erase_unknown(std::list &L) { @@ -1560,29 +2070,40 @@ auto i3 = L.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i1 + 1 clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} } void list_erase_ahead_of_end(std::list &L) { auto i0 = L.cbegin(), i1 = --L.cend(), i2 = L.cend(); + // expected-note@-1 5{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(L), "$L.begin()"); clang_analyzer_denote(clang_analyzer_container_end(L), "$L.end()"); auto i3 = L.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$}}}} + // expected-note@-1{{$L.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$}}}} + // expected-note@-1{{$L.end()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.end() } @@ -1591,32 +2112,41 @@ void vector_erase_begin(std::vector &V) { auto i0 = V.cbegin(), i1 = ++V.cbegin(), i2 = V.cend(); + // expected-note@-1 3{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.erase(i0); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $V.begin() + 1 } void vector_erase_behind_begin(std::vector &V, int n) { auto i0 = V.cbegin(), i1 = ++V.cbegin(), i2 = V.cend(); + // expected-note@-1 4{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} FIXME: Should be $V.begin() + 1 + // expected-note@-1{{$V.begin()}} FIXME: Should be $V.begin() + 1 // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $V.begin() + 2 } @@ -1629,27 +2159,36 @@ auto i3 = V.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i1 + 1 } void vector_erase_ahead_of_end(std::vector &V) { auto i0 = V.cbegin(), i1 = --V.cend(), i2 = V.cend(); + // expected-note@-1 4{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(V), "$V.begin()"); clang_analyzer_denote(clang_analyzer_container_end(V), "$V.end()"); auto i3 = V.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$V.begin(){{$}}}} + // expected-note@-1{{$V.begin()}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $V.end() } @@ -1663,30 +2202,38 @@ void deque_erase_begin(std::deque &D) { auto i0 = D.cbegin(), i1 = ++D.cbegin(), i2 = D.cend(); + // expected-note@-1 3{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.erase(i0); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.begin() + 1 } void deque_erase_behind_begin(std::deque &D, int n) { auto i0 = D.cbegin(), i1 = ++D.cbegin(), i2 = D.cend(); + // expected-note@-1 3{{Iterator incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.begin() + 2 } @@ -1700,24 +2247,31 @@ auto i3 = D.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $i1 + 1 } void deque_erase_ahead_of_end(std::deque &D) { auto i0 = D.cbegin(), i1 = --D.cend(), i2 = D.cend(); + // expected-note@-1 3{{Iterator decremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(D), "$D.begin()"); clang_analyzer_denote(clang_analyzer_container_end(D), "$D.end()"); auto i3 = D.erase(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $D.end() } @@ -1737,30 +2291,42 @@ void forward_list_erase_after_begin(std::forward_list &FL) { auto i0 = FL.cbegin(), i1 = ++FL.cbegin(), i2 = i1, i3 = FL.cend(); + // expected-note@-1 7{{Iterator incremented by 1}} ++i2; + // expected-note@-1 7{{Iterator 'i2' incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(FL), "$FL.begin()"); clang_analyzer_denote(clang_analyzer_container_end(FL), "$FL.end()"); auto i4 = FL.erase_after(i0); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$FL.begin() + 2{{$}}}} FIXME: Should be $FL.begin() + 1 + // expected-note@-1{{$FL.begin() + 2}} FIXME: Should be $FL.begin() + 1 // clang_analyzer_express(clang_analyzer_iterator_position(i4)); FIXME: expect warning $FL.begin() + 1 clang_analyzer_express(clang_analyzer_iterator_position(i3)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } void forward_list_erase_after_unknown(std::forward_list &FL) { auto i0 = FL.cbegin(), i1 = return_any_iterator(FL.cbegin()), i2 = i1, i3 = i1, i4 = FL.cend(); ++i2; + // expected-note@-1 9{{Iterator 'i2' incremented by 1}} ++i3; + // expected-note@-1 9{{Iterator 'i3' incremented by 1}} ++i3; + // expected-note@-1 9{{Iterator 'i3' incremented by 1}} clang_analyzer_denote(clang_analyzer_container_begin(FL), "$FL.begin()"); clang_analyzer_denote(clang_analyzer_container_end(FL), "$FL.end()"); @@ -1768,17 +2334,26 @@ auto i5 = FL.erase_after(i1); - clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{FALSE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); //expected-warning{{TRUE}} - clang_analyzer_eval(clang_analyzer_iterator_validity(i4)); //expected-warning{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); // expected-warning{{FALSE}} + // expected-note@-1{{FALSE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i3)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} + clang_analyzer_eval(clang_analyzer_iterator_validity(i4)); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$FL.begin(){{$}}}} + // expected-note@-1{{$FL.begin()}} clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$i1{{$}}}} + // expected-note@-1{{$i1}} clang_analyzer_express(clang_analyzer_iterator_position(i3)); // expected-warning-re {{$i1 + 2{{$}}}} FIXME: Should be $i1 + 1 + // expected-note@-1{{$i1 + 2}} FIXME: Should be $i1 + 1 // clang_analyzer_express(clang_analyzer_iterator_position(i5)); FIXME: expect warning $i1 + 1 clang_analyzer_express(clang_analyzer_iterator_position(i4)); // expected-warning-re {{$FL.end(){{$}}}} + // expected-note@-1{{$FL.end()}} } struct simple_iterator_base { @@ -1826,21 +2401,24 @@ void deferred_assumption(std::vector &V, int e) { const auto first = V.begin(); const auto comp1 = (first != V.end()), comp2 = (first == V.end()); - if (comp1) { + if (comp1) { // expected-note{{'comp1' is true}} + // expected-note@-1{{Taking true branch}} clang_analyzer_eval(clang_analyzer_container_end(V) == clang_analyzer_iterator_position(first)); // expected-warning@-1{{FALSE}} + // expected-note@-2{{FALSE}} } } void loop(std::vector &V, int e) { auto start = V.begin(); - while (true) { + while (true) { // expected-note{{Loop condition is true. Entering loop body}} auto item = std::find(start, V.end(), e); - if (item == V.end()) + if (item == V.end()) // expected-note{{Taking false branch}} break; clang_analyzer_eval(clang_analyzer_container_end(V) == clang_analyzer_iterator_position(item)); // expected-warning@-1{{FALSE}} + // expected-note@-2{{FALSE}} } } @@ -1859,9 +2437,14 @@ auto first = nonStdFind(V.begin(), V.end(), e); clang_analyzer_eval(clang_analyzer_container_end(V) == clang_analyzer_iterator_position(first)); // expected-warning@-1{{FALSE}} expected-warning@-1{{TRUE}} - if (V.end() != first) { + // expected-note@-2{{FALSE}} expected-note@-2{{TRUE}} + // expected-note@-3 2{{Assuming the condition is false}} + // expected-note@-4{{Assuming the condition is true}} + if (V.end() != first) { // expected-note{{Taking true branch}} + clang_analyzer_eval(clang_analyzer_container_end(V) == clang_analyzer_iterator_position(first)); // expected-warning@-1{{FALSE}} + // expected-note@-2{{FALSE}} } } @@ -1876,8 +2459,10 @@ auto i = c.begin(); clang_analyzer_eval(clang_analyzer_iterator_container(i) == &c); // expected-warning{{TRUE}} + // expected-note@-1{{TRUE}} clang_analyzer_denote(clang_analyzer_container_begin(c), "$c.begin()"); - clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$c.begin()}} + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$c.begin(){{$}}}} + // expected-note@-1{{$c.begin()}} if (i != c.begin()) { clang_analyzer_warnIfReached(); @@ -1889,10 +2474,12 @@ clang_analyzer_denote(clang_analyzer_container_begin(c), "$c.begin()"); - auto j = ++i; + auto j = ++i; // expected-note 2{{Iterator 'i' incremented by 1}} - clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$c.begin() + 1}} - clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning{{$c.begin() + 1}} + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$c.begin() + 1{{$}}}} + // expected-note@-1{{$c.begin() + 1}} + clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$c.begin() + 1{{$}}}} + // expected-note@-1{{$c.begin() + 1}} } void prefix_decrement_ptr_iterator(const cont_with_ptr_iterator &c) { @@ -1900,10 +2487,12 @@ clang_analyzer_denote(clang_analyzer_container_end(c), "$c.end()"); - auto j = --i; + auto j = --i; // expected-note 2{{Iterator 'i' decremented by 1}} - clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$c.end() - 1}} - clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning{{$c.end() - 1}} + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$c.end() - 1{{$}}}} + // expected-note@-1{{$c.end() - 1}} + clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$c.end() - 1{{$}}}} + // expected-note@-1{{$c.end() - 1}} } void postfix_increment_ptr_iterator(const cont_with_ptr_iterator &c) { @@ -1911,10 +2500,12 @@ clang_analyzer_denote(clang_analyzer_container_begin(c), "$c.begin()"); - auto j = i++; + auto j = i++; // expected-note 2{{Iterator 'i' incremented by 1}} - clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$c.begin() + 1}} - clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning{{$c.begin()}} + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$c.begin() + 1{{$}}}} + // expected-note@-1{{$c.begin() + 1}} + clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$c.begin(){{$}}}} + // expected-note@-1{{$c.begin()}} } void postfix_decrement_ptr_iterator(const cont_with_ptr_iterator &c) { @@ -1922,10 +2513,12 @@ clang_analyzer_denote(clang_analyzer_container_end(c), "$c.end()"); - auto j = i--; + auto j = i--; // expected-note 2{{Iterator 'i' decremented by 1}} - clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$c.end() - 1}} - clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning{{$c.end()}} + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$c.end() - 1{{$}}}} + // expected-note@-1{{$c.end() - 1}} + clang_analyzer_express(clang_analyzer_iterator_position(j)); // expected-warning-re {{$c.end(){{$}}}} + // expected-note@-1{{$c.end()}} } void plus_equal_ptr_iterator(const cont_with_ptr_iterator &c) { @@ -1933,9 +2526,10 @@ clang_analyzer_denote(clang_analyzer_container_begin(c), "$c.begin()"); - i += 2; + i += 2; // expected-note {{Iterator 'i' incremented by 2}} - clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$c.begin() + 2}} + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$c.begin() + 2{{$}}}} + // expected-note@-1{{$c.begin() + 2}} } void minus_equal_ptr_iterator(const cont_with_ptr_iterator &c) { @@ -1943,9 +2537,10 @@ clang_analyzer_denote(clang_analyzer_container_end(c), "$c.end()"); - i -= 2; + i -= 2; // expected-note {{Iterator 'i' decremented by 2}} - clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$c.end() - 2}} + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning-re {{$c.end() - 2{{$}}}} + // expected-note@-1{{$c.end() - 2}} } void minus_equal_ptr_iterator_variable(const cont_with_ptr_iterator &c, @@ -1960,11 +2555,14 @@ clang_analyzer_denote(clang_analyzer_container_begin(c), "$c.begin()"); - auto i2 = i1 + 2; + auto i2 = i1 + 2; // expected-note 3{{Iterator 'i1' incremented by 2}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &c); // expected-warning{{TRUE}} - clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning{{$c.begin()}} - clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning{{$c.begin() + 2}} + // expected-note@-1{{TRUE}} + clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$c.begin(){{$}}}} + // expected-note@-1{{$c.begin()}} + clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$c.begin() + 2{{$}}}} + // expected-note@-1{{$c.begin() + 2}} } void minus_ptr_iterator(const cont_with_ptr_iterator &c) { @@ -1972,11 +2570,14 @@ clang_analyzer_denote(clang_analyzer_container_end(c), "$c.end()"); - auto i2 = i1 - 2; + auto i2 = i1 - 2; // expected-note 3{{Iterator 'i1' decremented by 2}} clang_analyzer_eval(clang_analyzer_iterator_container(i2) == &c); // expected-warning{{TRUE}} - clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning{{$c.end()}} - clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning{{$c.end() - 2}} + // expected-note@-1{{TRUE}} + clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$c.end(){{$}}}} + // expected-note@-1{{$c.end()}} + clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$c.end() - 2{{$}}}} + // expected-note@-1{{$c.end() - 2}} } void ptr_iter_diff(cont_with_ptr_iterator &c) { @@ -1990,6 +2591,37 @@ ++i0; } +/// Track the right iterators only + +void prefix_increment2(const std::vector &v) { + auto i = v.begin(), j = v.begin(); + + clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); + + auto k = ++j; // expected-note 2{{Iterator 'j' incremented by 1}} + // FIXME: Expect only one note. + + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$v.begin()}} + // expected-note@-1{{$v.begin()}} + + clang_analyzer_express(clang_analyzer_iterator_position(k)); // expected-warning{{$v.begin() + 1}} + // expected-note@-1{{$v.begin() + 1}} +} + +void prefix_increment3(const std::vector &v) { + auto i = v.begin(), j = v.begin(); + + clang_analyzer_denote(clang_analyzer_container_begin(v), "$v.begin()"); + + auto k = ++j; // expected-note{{Iterator 'j' incremented by 1}} + // FIXME: expect no note. + + clang_analyzer_express(clang_analyzer_iterator_position(i)); // expected-warning{{$v.begin()}} + // expected-note@-1{{$v.begin()}} +} + +/// Print State + void clang_analyzer_printState(); void print_state(std::vector &V) { Index: clang/test/Analysis/iterator-range.cpp =================================================================== --- clang/test/Analysis/iterator-range.cpp +++ clang/test/Analysis/iterator-range.cpp @@ -1,5 +1,14 @@ -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=false -analyzer-output=text %s -verify -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 -analyzer-output=text %s -verify +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange\ +// RUN: -analyzer-config aggressive-binary-operation-simplification=true\ +// RUN: -analyzer-config c++-container-inlining=false -analyzer-output=text %s\ +// RUN: -verify + +// RUN: %clang_analyze_cc1 -std=c++11\ +// RUN: -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange\ +// RUN: -analyzer-config aggressive-binary-operation-simplification=true\ +// RUN: -analyzer-config c++-container-inlining=true -DINLINE=1\ +// RUN: -analyzer-output=text %s -verify #include "Inputs/system-header-simulator-cxx.h" @@ -171,7 +180,7 @@ } void incr_by_2_ahead_of_end(const std::vector &V) { - auto i = --V.end(); + auto i = --V.end(); // expected-note{{Iterator decremented by 1}} i += 2; // expected-warning{{Iterator incremented behind the past-the-end iterator}} // expected-note@-1{{Iterator incremented behind the past-the-end iterator}} } @@ -206,7 +215,7 @@ } void incr_by_2_copy_ahead_of_end(const std::vector &V) { - auto i = --V.end(); + auto i = --V.end(); // expected-note{{Iterator decremented by 1}} auto j = i + 2; // expected-warning{{Iterator incremented behind the past-the-end iterator}} // expected-note@-1{{Iterator incremented behind the past-the-end iterator}} } @@ -226,7 +235,7 @@ } void decr_by_2_behind_begin(const std::vector &V) { - auto i = ++V.begin(); + auto i = ++V.begin(); // expected-note{{Iterator incremented by 1}} i -= 2; // expected-warning{{Iterator decremented ahead of its valid range}} // expected-note@-1{{Iterator decremented ahead of its valid range}} } @@ -261,7 +270,7 @@ } void decr_by_2_copy_behind_begin(const std::vector &V) { - auto i = ++V.begin(); + auto i = ++V.begin(); // expected-note{{Iterator incremented by 1}} auto j = i - 2; // expected-warning{{Iterator decremented ahead of its valid range}} // expected-note@-1{{Iterator decremented ahead of its valid range}} } @@ -453,7 +462,7 @@ } void advance_plus_2_ahead_of_end(const std::vector &V) { - auto i = --V.end(); + auto i = --V.end(); // expected-note{{Iterator decremented by 1}} std::advance(i, 2); // expected-warning{{Iterator incremented behind the past-the-end iterator}} // expected-note@-1{{Iterator incremented behind the past-the-end iterator}} } @@ -473,7 +482,7 @@ } void advance_minus_2_behind_begin(const std::vector &V) { - auto i = ++V.begin(); + auto i = ++V.begin(); // expected-note{{Iterator incremented by 1}} std::advance(i, -2); // expected-warning{{Iterator decremented ahead of its valid range}} // expected-note@-1{{Iterator decremented ahead of its valid range}} } @@ -598,7 +607,7 @@ } void next_plus_2_ahead_of_end(const std::vector &V) { - auto i = --V.end(); + auto i = --V.end(); // expected-note{{Iterator decremented by 1}} auto j = std::next(i, 2); // expected-warning{{Iterator incremented behind the past-the-end iterator}} // expected-note@-1{{Iterator incremented behind the past-the-end iterator}} } @@ -618,7 +627,7 @@ } void next_minus_2_behind_begin(const std::vector &V) { - auto i = ++V.begin(); + auto i = ++V.begin(); // expected-note{{Iterator incremented by 1}} auto j = std::next(i, -2); // expected-warning{{Iterator decremented ahead of its valid range}} // expected-note@-1{{Iterator decremented ahead of its valid range}} } @@ -734,7 +743,7 @@ } void prev_plus_2_behind_begin(const std::vector &V) { - auto i = ++V.begin(); + auto i = ++V.begin(); // expected-note{{Iterator incremented by 1}} auto j = std::prev(i, 2); // expected-warning{{Iterator decremented ahead of its valid range}} // expected-note@-1{{Iterator decremented ahead of its valid range}} } @@ -772,7 +781,7 @@ } void prev_minus_2_ahead_of_end(const std::vector &V) { - auto i = --V.end(); + auto i = --V.end(); // expected-note{{Iterator decremented by 1}} auto j = std::prev(i, -2); // expected-warning{{Iterator incremented behind the past-the-end iterator}} // expected-note@-1{{Iterator incremented behind the past-the-end iterator}} } @@ -847,7 +856,7 @@ // Container modification - test path notes void deref_end_after_pop_back(std::vector &V) { - const auto i = --V.end(); + const auto i = --V.end(); // expected-note{{Iterator decremented by 1}} V.pop_back(); // expected-note{{Container 'V' shrank from the back by 1 position}} @@ -939,3 +948,12 @@ auto i0 = c.begin(), i1 = c.end(); ptrdiff_t len = i1 - i0; // no-crash } + +// Iterator modification - test path notes + +void deref_end2(const std::vector &V) { + auto i = --V.end(); // expected-note{{Iterator decremented by 1}} + ++i; // expected-note{{Iterator 'i' incremented by 1}} + *i; // expected-warning{{Past-the-end iterator dereferenced}} + // expected-note@-1{{Past-the-end iterator dereferenced}} +}