1*67e74705SXin Li //===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li /// 10*67e74705SXin Li /// \file 11*67e74705SXin Li /// \brief Defines and computes precedence levels for binary/ternary operators. 12*67e74705SXin Li /// 13*67e74705SXin Li //===----------------------------------------------------------------------===// 14*67e74705SXin Li #include "clang/Basic/OperatorPrecedence.h" 15*67e74705SXin Li 16*67e74705SXin Li namespace clang { 17*67e74705SXin Li getBinOpPrecedence(tok::TokenKind Kind,bool GreaterThanIsOperator,bool CPlusPlus11)18*67e74705SXin Liprec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, 19*67e74705SXin Li bool CPlusPlus11) { 20*67e74705SXin Li switch (Kind) { 21*67e74705SXin Li case tok::greater: 22*67e74705SXin Li // C++ [temp.names]p3: 23*67e74705SXin Li // [...] When parsing a template-argument-list, the first 24*67e74705SXin Li // non-nested > is taken as the ending delimiter rather than a 25*67e74705SXin Li // greater-than operator. [...] 26*67e74705SXin Li if (GreaterThanIsOperator) 27*67e74705SXin Li return prec::Relational; 28*67e74705SXin Li return prec::Unknown; 29*67e74705SXin Li 30*67e74705SXin Li case tok::greatergreater: 31*67e74705SXin Li // C++11 [temp.names]p3: 32*67e74705SXin Li // 33*67e74705SXin Li // [...] Similarly, the first non-nested >> is treated as two 34*67e74705SXin Li // consecutive but distinct > tokens, the first of which is 35*67e74705SXin Li // taken as the end of the template-argument-list and completes 36*67e74705SXin Li // the template-id. [...] 37*67e74705SXin Li if (GreaterThanIsOperator || !CPlusPlus11) 38*67e74705SXin Li return prec::Shift; 39*67e74705SXin Li return prec::Unknown; 40*67e74705SXin Li 41*67e74705SXin Li default: return prec::Unknown; 42*67e74705SXin Li case tok::comma: return prec::Comma; 43*67e74705SXin Li case tok::equal: 44*67e74705SXin Li case tok::starequal: 45*67e74705SXin Li case tok::slashequal: 46*67e74705SXin Li case tok::percentequal: 47*67e74705SXin Li case tok::plusequal: 48*67e74705SXin Li case tok::minusequal: 49*67e74705SXin Li case tok::lesslessequal: 50*67e74705SXin Li case tok::greatergreaterequal: 51*67e74705SXin Li case tok::ampequal: 52*67e74705SXin Li case tok::caretequal: 53*67e74705SXin Li case tok::pipeequal: return prec::Assignment; 54*67e74705SXin Li case tok::question: return prec::Conditional; 55*67e74705SXin Li case tok::pipepipe: return prec::LogicalOr; 56*67e74705SXin Li case tok::caretcaret: 57*67e74705SXin Li case tok::ampamp: return prec::LogicalAnd; 58*67e74705SXin Li case tok::pipe: return prec::InclusiveOr; 59*67e74705SXin Li case tok::caret: return prec::ExclusiveOr; 60*67e74705SXin Li case tok::amp: return prec::And; 61*67e74705SXin Li case tok::exclaimequal: 62*67e74705SXin Li case tok::equalequal: return prec::Equality; 63*67e74705SXin Li case tok::lessequal: 64*67e74705SXin Li case tok::less: 65*67e74705SXin Li case tok::greaterequal: return prec::Relational; 66*67e74705SXin Li case tok::lessless: return prec::Shift; 67*67e74705SXin Li case tok::plus: 68*67e74705SXin Li case tok::minus: return prec::Additive; 69*67e74705SXin Li case tok::percent: 70*67e74705SXin Li case tok::slash: 71*67e74705SXin Li case tok::star: return prec::Multiplicative; 72*67e74705SXin Li case tok::periodstar: 73*67e74705SXin Li case tok::arrowstar: return prec::PointerToMember; 74*67e74705SXin Li } 75*67e74705SXin Li } 76*67e74705SXin Li 77*67e74705SXin Li } // namespace clang 78