Added back explicit state/node creation when visiting IntegerLiterals and
CharacterLiterals. This may not be a permanent solution; it doesn't cost that much, however, to create a few additional states, and solves a whole bunch of edge cases when handling ?, ||, and &&. llvm-svn: 47299
This commit is contained in:
		
							parent
							
								
									e0188e6ad7
								
							
						
					
					
						commit
						8b51dc2754
					
				| 
						 | 
				
			
			@ -839,7 +839,7 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
 | 
			
		|||
      
 | 
			
		||||
    default:
 | 
			
		||||
      // Cases we intentionally have "default" handle:
 | 
			
		||||
      //   AddrLabelExpr, CharacterLiteral, IntegerLiteral
 | 
			
		||||
      //   AddrLabelExpr
 | 
			
		||||
      
 | 
			
		||||
      Dst.Add(Pred); // No-op. Simply propagate the current state unchanged.
 | 
			
		||||
      break;
 | 
			
		||||
| 
						 | 
				
			
			@ -873,6 +873,19 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
 | 
			
		|||
      break;
 | 
			
		||||
    }
 | 
			
		||||
      
 | 
			
		||||
      // While explicitly creating a node+state for visiting a CharacterLiteral
 | 
			
		||||
      // seems wasteful, it also solves a bunch of problems when handling
 | 
			
		||||
      // the ?, &&, and ||.
 | 
			
		||||
      
 | 
			
		||||
    case Stmt::CharacterLiteralClass: {
 | 
			
		||||
      CharacterLiteral* C = cast<CharacterLiteral>(S);
 | 
			
		||||
      StateTy St = Pred->getState();
 | 
			
		||||
      NonLValue X = NonLValue::GetValue(ValMgr, C->getValue(), C->getType(),
 | 
			
		||||
                                        C->getLoc());
 | 
			
		||||
      Nodify(Dst, C, Pred, SetValue(St, C, X));
 | 
			
		||||
      break;      
 | 
			
		||||
    }
 | 
			
		||||
      
 | 
			
		||||
    case Stmt::ChooseExprClass: { // __builtin_choose_expr
 | 
			
		||||
      ChooseExpr* C = cast<ChooseExpr>(S);
 | 
			
		||||
      VisitGuardedExpr(C, C->getLHS(), C->getRHS(), Pred, Dst);
 | 
			
		||||
| 
						 | 
				
			
			@ -897,6 +910,18 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
 | 
			
		|||
      VisitDeclStmt(cast<DeclStmt>(S), Pred, Dst);
 | 
			
		||||
      break;
 | 
			
		||||
      
 | 
			
		||||
      // While explicitly creating a node+state for visiting an IntegerLiteral
 | 
			
		||||
      // seems wasteful, it also solves a bunch of problems when handling
 | 
			
		||||
      // the ?, &&, and ||.
 | 
			
		||||
      
 | 
			
		||||
    case Stmt::IntegerLiteralClass: {      
 | 
			
		||||
      StateTy St = Pred->getState();
 | 
			
		||||
      IntegerLiteral* I = cast<IntegerLiteral>(S);
 | 
			
		||||
      NonLValue X = NonLValue::GetValue(ValMgr, I);
 | 
			
		||||
      Nodify(Dst, I, Pred, SetValue(St, I, X));
 | 
			
		||||
      break;      
 | 
			
		||||
    }
 | 
			
		||||
      
 | 
			
		||||
    case Stmt::ImplicitCastExprClass: {
 | 
			
		||||
      ImplicitCastExpr* C = cast<ImplicitCastExpr>(S);
 | 
			
		||||
      VisitCast(C, C->getSubExpr(), Pred, Dst);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -232,7 +232,7 @@ RValue ValueStateManager::GetValue(ValueState St, Expr* E, bool* hasVal) {
 | 
			
		|||
        
 | 
			
		||||
        // Integer literals evaluate to an RValue.  Simply retrieve the
 | 
			
		||||
        // RValue for the literal.
 | 
			
		||||
        
 | 
			
		||||
#if 0        
 | 
			
		||||
      case Stmt::IntegerLiteralClass:
 | 
			
		||||
        return NonLValue::GetValue(ValMgr, cast<IntegerLiteral>(E));
 | 
			
		||||
        
 | 
			
		||||
| 
						 | 
				
			
			@ -242,6 +242,7 @@ RValue ValueStateManager::GetValue(ValueState St, Expr* E, bool* hasVal) {
 | 
			
		|||
        return NonLValue::GetValue(ValMgr, C->getValue(), C->getType(),
 | 
			
		||||
                                   C->getLoc());
 | 
			
		||||
      }
 | 
			
		||||
#endif        
 | 
			
		||||
 | 
			
		||||
        // Casts where the source and target type are the same
 | 
			
		||||
        // are no-ops.  We blast through these to get the descendant
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue