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