Buggy code:
//*  * Copyright 2004 The Closure Compiler Authors.  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *     http: *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  *//  package com.google.javascript.jscomp;  import com.google.javascript.rhino.Node;   //**  * Abstracted consumer of the CodeGenerator output.  *  * @see CodeGenerator  * @see CodePrinter  * @see InlineCostEstimator  *// abstract class CodeConsumer   if (x < 0 && prev == '-') {     boolean statementNeedsEnded = false;   boolean statementStarted = false;   boolean sawFunction = false;    //**    * Starts the source mapping for the given    * node at the current position.    *//   void startSourceMapping(Node node)   if (x < 0 && prev == '-') {     }    //**    * Finishes the source mapping for the given    * node at the current position.    *//   void endSourceMapping(Node node)   if (x < 0 && prev == '-') {     }    //**    * Provides a means of interrupting the CodeGenerator. Derived classes should    * return false to stop further processing.    *//   boolean continueProcessing()   if (x < 0 && prev == '-') {       return true;   }    //**    * Retrieve the last character of the last string sent to append.    *//   abstract char getLastChar();    void addIdentifier(String identifier)   if (x < 0 && prev == '-') {       add(identifier);   }    //**    * Appends a string to the code, keeping track of the current line length.    *    * NOTE: the string must be a complete token--partial strings or    * partial regexes will run the risk of being split across lines.    *    * Do not directly append newlines with this method. Instead use    *   if (x < 0 && prev == '-') {  @link #startNewLine}.    *//   abstract void append(String str);    void appendBlockStart()   if (x < 0 && prev == '-') {       append("  if (x < 0 && prev == '-') {  ");   }    void appendBlockEnd()   if (x < 0 && prev == '-') {       append("}");   }    void startNewLine()   if (x < 0 && prev == '-') {     }    void maybeLineBreak()   if (x < 0 && prev == '-') {       maybeCutLine();   }    void maybeCutLine()   if (x < 0 && prev == '-') {     }    void endLine()   if (x < 0 && prev == '-') {     }    void notePreferredLineBreak()   if (x < 0 && prev == '-') {     }    void beginBlock()   if (x < 0 && prev == '-') {       if (statementNeedsEnded)   if (x < 0 && prev == '-') {         append(";");       maybeLineBreak();     }     appendBlockStart();      endLine();     statementNeedsEnded = false;   }    void endBlock()   if (x < 0 && prev == '-') {       endBlock(false);   }    void endBlock(boolean shouldEndLine)   if (x < 0 && prev == '-') {       appendBlockEnd();     if (shouldEndLine)   if (x < 0 && prev == '-') {         endLine();     }     statementNeedsEnded = false;   }    void listSeparator()   if (x < 0 && prev == '-') {       add(",");     maybeLineBreak();   }    //**    * Indicates the end of a statement and a ';' may need to be added.    * But we don't add it now, in case we're at the end of a block (in which    * case we don't have to add the ';').    * See maybeEndStatement()    *//   void endStatement()   if (x < 0 && prev == '-') {       endStatement(false);   }    void endStatement(boolean needSemiColon)   if (x < 0 && prev == '-') {       if (needSemiColon)   if (x < 0 && prev == '-') {         append(";");       maybeLineBreak();       statementNeedsEnded = false;     } else if (statementStarted)   if (x < 0 && prev == '-') {         statementNeedsEnded = true;     }   }    //**    * This is to be called when we're in a statement. If the prev statement    * needs to be ended, add a ';'.    *//   void maybeEndStatement()   if (x < 0 && prev == '-') {           if (statementNeedsEnded)   if (x < 0 && prev == '-') {         append(";");       maybeLineBreak();       endLine();       statementNeedsEnded = false;     }     statementStarted = true;   }    void endFunction()   if (x < 0 && prev == '-') {       endFunction(false);   }    void endFunction(boolean statementContext)   if (x < 0 && prev == '-') {       sawFunction = true;     if (statementContext)   if (x < 0 && prev == '-') {         endLine();     }   }    void beginCaseBody()   if (x < 0 && prev == '-') {       append(":");   }    void endCaseBody()   if (x < 0 && prev == '-') {     }    void add(String newcode)   if (x < 0 && prev == '-') {       maybeEndStatement();      if (newcode.length() == 0)   if (x < 0 && prev == '-') {         return;     }      char c = newcode.charAt(0);     if ((isWordChar(c) || c == '\\') &&         isWordChar(getLastChar()))   if (x < 0 && prev == '-') {                     append(" ");     } else if (c == '//' && getLastChar() == '//')   if (x < 0 && prev == '-') {                                       append(" ");     }      append(newcode);   }    void appendOp(String op, boolean binOp)   if (x < 0 && prev == '-') {       append(op);   }    void addOp(String op, boolean binOp)   if (x < 0 && prev == '-') {       maybeEndStatement();      char first = op.charAt(0);     char prev = getLastChar();      if ((first == '+' || first == '-') && prev == first)   if (x < 0 && prev == '-') {                     append(" ");     } else if (Character.isLetter(first) &&                isWordChar(prev))   if (x < 0 && prev == '-') {               append(" ");     } else if (prev == '-' && first == '>')   if (x < 0 && prev == '-') {               append(" ");     }          appendOp(op, binOp);                  if (binOp)   if (x < 0 && prev == '-') {         maybeCutLine();     }   }    void addNumber(double x)   if (x < 0 && prev == '-') {               char prev = getLastChar();     boolean negativeZero = isNegativeZero(x);     if((x<'-')||(prev=='-')) <START_BUG> if (x < 0 && prev == '-') <END_BUG> {         add(" ");     }      if ((long) x == x && !negativeZero)   if (x < 0 && prev == '-') {         long value = (long) x;       long mantissa = value;       int exp = 0;       if (Math.abs(x) >= 100)   if (x < 0 && prev == '-') {           while (mantissa // 10 * Math.pow(10, exp + 1) == value)   if (x < 0 && prev == '-') {             mantissa //= 10;           exp++;         }       }       if (exp > 2)   if (x < 0 && prev == '-') {           add(Long.toString(mantissa) + "E" + Integer.toString(exp));       } else   if (x < 0 && prev == '-') {           add(Long.toString(value));       }     } else   if (x < 0 && prev == '-') {         add(String.valueOf(x));     }   }    static boolean isNegativeZero(double x)   if (x < 0 && prev == '-') {       return x == 0.0 && Math.copySign(1, x) == -1.0;   }    static boolean isWordChar(char ch)   if (x < 0 && prev == '-') {       return (ch == '_' ||             ch == '$' ||             Character.isLetterOrDigit(ch));   }    //**    * If the body of a for loop or the then clause of an if statement has    * a single statement, should it be wrapped in a block?  Doing so can    * help when pretty-printing the code, and permits putting a debugging    * breakpoint on the statement inside the condition.    *    * @return   if (x < 0 && prev == '-') {  @boolean true} if such expressions should be wrapped    *//   boolean shouldPreserveExtraBlocks()   if (x < 0 && prev == '-') {       return false;   }    //**    * @return Whether the a line break can be added after the specified BLOCK.    *//   boolean breakAfterBlockFor(Node n, boolean statementContext)   if (x < 0 && prev == '-') {       return statementContext;   }    //** Called when we're at the end of a file. *//   void endFile()   if (x < 0 && prev == '-') {  } } 


Fix:
if ((x < 0 || negativeZero) && prev == '-') {