[cfe-commits] r152820 - in /cfe/trunk: include/clang/AST/RecursiveASTVisitor.h test/Index/index-many-logical-ops.c

Argyrios Kyrtzidis kyrtzidis at apple.com
Mon Mar 19 13:58:06 PDT 2012


On Mar 16, 2012, at 8:00 PM, Matt Beaumont-Gay wrote:

> Hi Argyrios,
> 
> This changes the behavior of RAV subclasses which override the
> Traverse* methods. Is that intended?

Yes, intended. To elaborate:

There are 2 uses cases for overriding Traverse* methods:
1) You want to skip traversing a statement.
2) You want to do an action before and after traversing.

Both of these are incompatible with data recursion (#1 is incompatible because returning false from Traverse* will abort the whole AST traversal, not of just the current statement).
Subclasses of RAV can either:

-Return false from shouldUseDataRecursionFor() to reenable Traverse* for these specific statements that by default use data recursion.
-To do #1 but still use data recursion, a subclass can return false from shouldUseDataRecursionFor() for the specific statement that wants skipping, then skip it in Traverse*.

We could also add data-recursion specific methods to more easily do #1 and #2 while using data-recursion, though I didn't think it was high priority because currently no RAV subclass overrides Traverse* for those 3 statement kinds.

-Argyrios

> 
> Thanks,
> Matt
> 
> On Thu, Mar 15, 2012 at 11:07, Argyrios Kyrtzidis <akyrtzi at gmail.com> wrote:
>> Author: akirtzidis
>> Date: Thu Mar 15 13:07:19 2012
>> New Revision: 152820
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=152820&view=rev
>> Log:
>> Make RecursiveASTVisitor to traverse certain statements using data recursion
>> to avoid a stack overflow with extreme cases.
>> 
>> Part of rdar://10941790.
>> 
>> Added:
>>    cfe/trunk/test/Index/index-many-logical-ops.c
>> Modified:
>>    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>> 
>> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=152820&r1=152819&r2=152820&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
>> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Thu Mar 15 13:07:19 2012
>> @@ -148,6 +148,12 @@
>>   /// TypeLocs.
>>   bool shouldWalkTypesOfTypeLocs() const { return true; }
>> 
>> +  /// \brief Return whether \param S should be traversed using data recursion
>> +  /// to avoid a stack overflow with extreme cases.
>> +  bool shouldUseDataRecursionFor(Stmt *S) const {
>> +    return isa<BinaryOperator>(S) || isa<UnaryOperator>(S) || isa<CaseStmt>(S);
>> +  }
>> +
>>   /// \brief Recursively visit a statement or expression, by
>>   /// dispatching to Traverse*() based on the argument's dynamic type.
>>   ///
>> @@ -397,8 +403,102 @@
>>   bool TraverseDeclContextHelper(DeclContext *DC);
>>   bool TraverseFunctionHelper(FunctionDecl *D);
>>   bool TraverseVarHelper(VarDecl *D);
>> +
>> +  bool Walk(Stmt *S);
>> +
>> +  struct EnqueueJob {
>> +    Stmt *S;
>> +    Stmt::child_iterator StmtIt;
>> +
>> +    EnqueueJob(Stmt *S) : S(S), StmtIt() {
>> +      if (Expr *E = dyn_cast_or_null<Expr>(S))
>> +        S = E->IgnoreParens();
>> +    }
>> +  };
>> +  bool dataTraverse(Stmt *S);
>>  };
>> 
>> +template<typename Derived>
>> +bool RecursiveASTVisitor<Derived>::dataTraverse(Stmt *S) {
>> +
>> +  SmallVector<EnqueueJob, 16> Queue;
>> +  Queue.push_back(S);
>> +
>> +  while (!Queue.empty()) {
>> +    EnqueueJob &job = Queue.back();
>> +    Stmt *CurrS = job.S;
>> +    if (!CurrS) {
>> +      Queue.pop_back();
>> +      continue;
>> +    }
>> +
>> +    if (getDerived().shouldUseDataRecursionFor(CurrS)) {
>> +      if (job.StmtIt == Stmt::child_iterator()) {
>> +        if (!Walk(CurrS)) return false;
>> +        job.StmtIt = CurrS->child_begin();
>> +      } else {
>> +        ++job.StmtIt;
>> +      }
>> +
>> +      if (job.StmtIt != CurrS->child_end())
>> +        Queue.push_back(*job.StmtIt);
>> +      else
>> +        Queue.pop_back();
>> +      continue;
>> +    }
>> +
>> +    Queue.pop_back();
>> +    TRY_TO(TraverseStmt(CurrS));
>> +  }
>> +
>> +  return true;
>> +}
>> +
>> +template<typename Derived>
>> +bool RecursiveASTVisitor<Derived>::Walk(Stmt *S) {
>> +
>> +#define DISPATCH_WALK(NAME, CLASS, VAR) \
>> +  return getDerived().WalkUpFrom##NAME(static_cast<CLASS*>(VAR));
>> +
>> +  if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(S)) {
>> +    switch (BinOp->getOpcode()) {
>> +#define OPERATOR(NAME) \
>> +    case BO_##NAME: DISPATCH_WALK(Bin##NAME, BinaryOperator, S);
>> +
>> +    BINOP_LIST()
>> +#undef OPERATOR
>> +
>> +#define OPERATOR(NAME)                                          \
>> +    case BO_##NAME##Assign:                          \
>> +    DISPATCH_WALK(Bin##NAME##Assign, CompoundAssignOperator, S);
>> +
>> +    CAO_LIST()
>> +#undef OPERATOR
>> +    }
>> +  } else if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(S)) {
>> +    switch (UnOp->getOpcode()) {
>> +#define OPERATOR(NAME)                                                  \
>> +    case UO_##NAME: DISPATCH_WALK(Unary##NAME, UnaryOperator, S);
>> +
>> +    UNARYOP_LIST()
>> +#undef OPERATOR
>> +    }
>> +  }
>> +
>> +  // Top switch stmt: dispatch to TraverseFooStmt for each concrete FooStmt.
>> +  switch (S->getStmtClass()) {
>> +  case Stmt::NoStmtClass: break;
>> +#define ABSTRACT_STMT(STMT)
>> +#define STMT(CLASS, PARENT) \
>> +  case Stmt::CLASS##Class: DISPATCH_WALK(CLASS, CLASS, S);
>> +#include "clang/AST/StmtNodes.inc"
>> +  }
>> +
>> +#undef DISPATCH_WALK
>> +
>> +  return true;
>> +}
>> +
>>  #define DISPATCH(NAME, CLASS, VAR) \
>>   return getDerived().Traverse##NAME(static_cast<CLASS*>(VAR))
>> 
>> @@ -407,6 +507,9 @@
>>   if (!S)
>>     return true;
>> 
>> +  if (getDerived().shouldUseDataRecursionFor(S))
>> +    return dataTraverse(S);
>> +
>>   // If we have a binary expr, dispatch to the subcode of the binop.  A smart
>>   // optimizer (e.g. LLVM) will fold this comparison into the switch stmt
>>   // below.
>> 
>> Added: cfe/trunk/test/Index/index-many-logical-ops.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/index-many-logical-ops.c?rev=152820&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/Index/index-many-logical-ops.c (added)
>> +++ cfe/trunk/test/Index/index-many-logical-ops.c Thu Mar 15 13:07:19 2012
>> @@ -0,0 +1,2011 @@
>> +// RUN: c-index-test -index-file %s | FileCheck %s
>> +
>> +// rdar://10941790
>> +// Check that we don't get stack overflow trying to index a huge number of
>> +// logical operators.
>> +
>> +// CHECK: [indexDeclaration]: kind: function | name: foo
>> +int foo(int x) {
>> +  return
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x &&
>> +    x;
>> +}
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list