File tree Expand file tree Collapse file tree 2 files changed +14
-7
lines changed Expand file tree Collapse file tree 2 files changed +14
-7
lines changed Original file line number Diff line number Diff line change @@ -733,8 +733,8 @@ bool Compiler<Emitter>::VisitBinaryOperator(const BinaryOperator *BO) {
733733  }
734734
735735  //  Typecheck the args.
736-   std::optional<PrimType> LT = classify (LHS-> getType () );
737-   std::optional<PrimType> RT = classify (RHS-> getType () );
736+   std::optional<PrimType> LT = classify (LHS);
737+   std::optional<PrimType> RT = classify (RHS);
738738  std::optional<PrimType> T = classify (BO->getType ());
739739
740740  //  Special case for C++'s three-way/spaceship operator <=>, which
@@ -769,8 +769,16 @@ bool Compiler<Emitter>::VisitBinaryOperator(const BinaryOperator *BO) {
769769      return  this ->VisitPointerArithBinOp (BO);
770770  }
771771
772-   if  (!visit (LHS) || !visit (RHS))
773-     return  false ;
772+   //  Assignmentes require us to evalute the RHS first.
773+   if  (BO->getOpcode () == BO_Assign) {
774+     if  (!visit (RHS) || !visit (LHS))
775+       return  false ;
776+     if  (!this ->emitFlip (*LT, *RT, BO))
777+       return  false ;
778+   } else  {
779+     if  (!visit (LHS) || !visit (RHS))
780+       return  false ;
781+   }
774782
775783  //  For languages such as C, cast the result of one
776784  //  of our comparision opcodes to T (which is usually int).
Original file line number Diff line number Diff line change @@ -45,7 +45,7 @@ namespace EvalOrder {
4545    }
4646    template  <typename  T> constexpr  T &&b(T &&v) {
4747      if  (!done_a)
48-         throw  " wrong"  ; //  expected-note 4 {{not valid}}
48+         throw  " wrong"  ; //  expected-note 3 {{not valid}}
4949      done_b = true ;
5050      return  (T &&)v;
5151    }
@@ -78,8 +78,7 @@ namespace EvalOrder {
7878  SEQ (A(f)(B(1 ), B(2 ), B(3 )));
7979
8080  //  Rule 5: b = a, b @= a
81-   SEQ (B(lvalue<int >().get()) = A(0 )); //  expected-error {{not an integral constant expression}} FIXME \
82-                                       // expected-note 2{{in call to}} 
81+   SEQ (B(lvalue<int >().get()) = A(0 ));
8382  SEQ (B(lvalue<UserDefined>().get()) = A(ud)); //  expected-error {{not an integral constant expression}} FIXME \
8483                                               // expected-note 2{{in call to}} 
8584  SEQ (B(lvalue<int >().get()) += A(0 ));
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments