OperatorPrecedence.cpp revision 263508
11539Srgrimes//===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===//
21539Srgrimes//
31539Srgrimes//                     The LLVM Compiler Infrastructure
41539Srgrimes//
51539Srgrimes// This file is distributed under the University of Illinois Open Source
61539Srgrimes// License. See LICENSE.TXT for details.
71539Srgrimes//
81539Srgrimes//===----------------------------------------------------------------------===//
91539Srgrimes///
101539Srgrimes/// \file
111539Srgrimes/// \brief Defines and computes precedence levels for binary/ternary operators.
121539Srgrimes///
13203964Simp//===----------------------------------------------------------------------===//
141539Srgrimes#include "clang/Basic/OperatorPrecedence.h"
151539Srgrimes
161539Srgrimesnamespace clang {
171539Srgrimes
181539Srgrimesprec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator,
191539Srgrimes                               bool CPlusPlus11) {
201539Srgrimes  switch (Kind) {
211539Srgrimes  case tok::greater:
221539Srgrimes    // C++ [temp.names]p3:
231539Srgrimes    //   [...] When parsing a template-argument-list, the first
241539Srgrimes    //   non-nested > is taken as the ending delimiter rather than a
251539Srgrimes    //   greater-than operator. [...]
261539Srgrimes    if (GreaterThanIsOperator)
271539Srgrimes      return prec::Relational;
281539Srgrimes    return prec::Unknown;
2923657Speter
3055031Sbde  case tok::greatergreater:
311539Srgrimes    // C++11 [temp.names]p3:
321539Srgrimes    //
331539Srgrimes    //   [...] Similarly, the first non-nested >> is treated as two
347865Sbde    //   consecutive but distinct > tokens, the first of which is
351539Srgrimes    //   taken as the end of the template-argument-list and completes
3633861Sbde    //   the template-id. [...]
37123257Smarcel    if (GreaterThanIsOperator || !CPlusPlus11)
38102227Smike      return prec::Shift;
3933861Sbde    return prec::Unknown;
40103728Swollman
41102227Smike  default:                        return prec::Unknown;
42102227Smike  case tok::comma:                return prec::Comma;
43102227Smike  case tok::equal:
4415483Sbde  case tok::starequal:
4515483Sbde  case tok::slashequal:
4615483Sbde  case tok::percentequal:
47102227Smike  case tok::plusequal:
48102227Smike  case tok::minusequal:
49102227Smike  case tok::lesslessequal:
501539Srgrimes  case tok::greatergreaterequal:
511539Srgrimes  case tok::ampequal:
5299640Sobrien  case tok::caretequal:
53102227Smike  case tok::pipeequal:            return prec::Assignment;
54264496Stijl  case tok::question:             return prec::Conditional;
55102227Smike  case tok::pipepipe:             return prec::LogicalOr;
561539Srgrimes  case tok::ampamp:               return prec::LogicalAnd;
5799640Sobrien  case tok::pipe:                 return prec::InclusiveOr;
581539Srgrimes  case tok::caret:                return prec::ExclusiveOr;
591539Srgrimes  case tok::amp:                  return prec::And;
60103766Sbde  case tok::exclaimequal:
61103766Sbde  case tok::equalequal:           return prec::Equality;
621539Srgrimes  case tok::lessequal:
631539Srgrimes  case tok::less:
641539Srgrimes  case tok::greaterequal:         return prec::Relational;
65103766Sbde  case tok::lessless:             return prec::Shift;
66103766Sbde  case tok::plus:
671539Srgrimes  case tok::minus:                return prec::Additive;
681539Srgrimes  case tok::percent:
691539Srgrimes  case tok::slash:
701539Srgrimes  case tok::star:                 return prec::Multiplicative;
711539Srgrimes  case tok::periodstar:
72252608Sache  case tok::arrowstar:            return prec::PointerToMember;
731539Srgrimes  }
74227753Stheraven}
75233600Stheraven
76233600Stheraven}  // namespace clang
77233600Stheraven