rtrieu added a comment.

This seems rather strange.  Usually, a OpaqueValueExpr will hold an expression 
that is held elsewhere in the AST.  However, in this case, it appears that all 
the references to --i are all behind OpaqueValueExpr's, so they aren't 
processed.

  `-CStyleCastExpr 0x5675d30 <line:11:5, col:19> 'void' <ToVoid>
    `-PseudoObjectExpr 0x5675d00 <col:11, col:19> 'id':'id'
      |-ObjCSubscriptRefExpr 0x5675c90 <col:11, col:19> '<pseudo-object type>' 
lvalue Kind=ArraySubscript GetterForArray="(null)" SetterForArray="(null)
      | |-OpaqueValueExpr 0x5675c50 <col:11> 'MyArray *'
      | | `-ImplicitCastExpr 0x5675bf0 <col:11> 'MyArray *' <LValueToRValue>
      | |   `-DeclRefExpr 0x5675b80 <col:11> 'MyArray *' lvalue Var 0x56756d0 
'test' 'MyArray *'
      | `-OpaqueValueExpr 0x5675c70 <col:16, col:18> 'unsigned int'
      |   `-UnaryOperator 0x5675bd0 <col:16, col:18> 'unsigned int' prefix '--'
      |     `-DeclRefExpr 0x5675ba8 <col:18> 'unsigned int' lvalue Var 
0x56759e0 'i' 'unsigned int'
      |-OpaqueValueExpr 0x5675c50 <col:11> 'MyArray *'
      | `-ImplicitCastExpr 0x5675bf0 <col:11> 'MyArray *' <LValueToRValue>
      |   `-DeclRefExpr 0x5675b80 <co        `-CStyleCastExpr 0x5675d30 
<line:11:5, col:19> 'void' <ToVoid>
    `-PseudoObjectExpr 0x5675d00 <col:11, col:19> 'id':'id'
      |-ObjCSubscriptRefExpr 0x5675c90 <col:11, col:19> '<pseudo-object type>' 
lvalue Kind=ArraySubscript GetterForArray="(null)" SetterForArray="(null)
      | |-OpaqueValueExpr 0x5675c50 <col:11> 'MyArray *'
      | | `-ImplicitCastExpr 0x5675bf0 <col:11> 'MyArray *' <LValueToRValue>
      | |   `-DeclRefExpr 0x5675b80 <col:11> 'MyArray *' lvalue Var 0x56756d0 
'test' 'MyArray *'
      | `-OpaqueValueExpr 0x5675c70 <col:16, col:18> 'unsigned int'
      |   `-UnaryOperator 0x5675bd0 <col:16, col:18> 'unsigned int' prefix '--'
      |     `-DeclRefExpr 0x5675ba8 <col:18> 'unsigned int' lvalue Var 
0x56759e0 'i' 'unsigned int'
      |-OpaqueValueExpr 0x5675c50 <col:11> 'MyArray *'
      | `-ImplicitCastExpr 0x5675bf0 <col:11> 'MyArray *' <LValueToRValue>
      |   `-DeclRefExpr 0x5675b80 <col:11> 'MyArray *' lvalue Var 0x56756d0 
'test' 'MyArray *'
      |-OpaqueValueExpr 0x5675c70 <col:16, col:18> 'unsigned int'
      | `-UnaryOperator 0x5675bd0 <col:16, col:18> 'unsigned int' prefix '--'
      |   `-DeclRefExpr 0x5675ba8 <col:18> 'unsigned int' lvalue Var 0x56759e0 
'i' 'unsigned int'
      `-ObjCMessageExpr 0x5675cc8 <col:11> 'id':'id' 
selector=objectAtIndexedSubscript:
        |-OpaqueValueExpr 0x5675c50 <col:11> 'MyArray *'
        | `-ImplicitCastExpr 0x5675bf0 <col:11> 'MyArray *' <LValueToRValue>
        |   `-DeclRefExpr 0x5675b80 <col:11> 'MyArray *' lvalue Var 0x56756d0 
'test' 'MyArray *'
        `-OpaqueValueExpr 0x5675c70 <col:16, col:18> 'unsigned int'
          `-UnaryOperator 0x5675bd0 <col:16, col:18> 'unsigned int' prefix '--'
            `-DeclRefExpr 0x5675ba8 <col:18> 'unsigned int' lvalue Var 
0x56759e0 'i' 'unsigned int'l:11> 'MyArray *' lvalue Var 0x56756d0 'test' 
'MyArray *'
      |-OpaqueValueExpr 0x5675c70 <col:16, col:18> 'unsigned int'
      | `-UnaryOperator 0x5675bd0 <col:16, col:18> 'unsigned int' prefix '--'
      |   `-DeclRefExpr 0x5675ba8 <col:18> 'unsigned int' lvalue Var 0x56759e0 
'i' 'unsigned int'
      `-ObjCMessageExpr 0x5675cc8 <col:11> 'id':'id' 
selector=objectAtIndexedSubscript:
        |-OpaqueValueExpr 0x5675c50 <col:11> 'MyArray *'
        | `-ImplicitCastExpr 0x5675bf0 <col:11> 'MyArray *' <LValueToRValue>
        |   `-DeclRefExpr 0x5675b80 <col:11> 'MyArray *' lvalue Var 0x56756d0 
'test' 'MyArray *'
        `-OpaqueValueExpr 0x5675c70 <col:16, col:18> 'unsigned int'
          `-UnaryOperator 0x5675bd0 <col:16, col:18> 'unsigned int' prefix '--'
            `-DeclRefExpr 0x5675ba8 <col:18> 'unsigned int' lvalue Var 
0x56759e0 'i' 'unsigned int'

Typically, we skip OpaqueValueExpr so that we don't process the same expression 
multiple times.  I don't know enough about Objective C to know whether this is 
the intended pattern or an oversight.  Instead of visiting all the 
sub-expressions of OpaqueValueExpr's, try to make a tighter visitor to avoid 
repeating work.  I think checking the sub-expressions of ObjCSubscriptRefExpr, 
and looking through the OpaqueValueExpr's there would be the best way for this.


http://reviews.llvm.org/D17627



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to