1249261Sdim//===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===// 2249261Sdim// 3249261Sdim// The LLVM Compiler Infrastructure 4249261Sdim// 5249261Sdim// This file is distributed under the University of Illinois Open Source 6249261Sdim// License. See LICENSE.TXT for details. 7249261Sdim// 8249261Sdim//===----------------------------------------------------------------------===// 9249261Sdim/// 10249261Sdim/// \file 11249261Sdim/// \brief Defines and computes precedence levels for binary/ternary operators. 12249261Sdim/// 13249261Sdim//===----------------------------------------------------------------------===// 14249261Sdim#include "clang/Basic/OperatorPrecedence.h" 15249261Sdim 16249261Sdimnamespace clang { 17249261Sdim 18249261Sdimprec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, 19249261Sdim bool CPlusPlus11) { 20249261Sdim switch (Kind) { 21249261Sdim case tok::greater: 22249261Sdim // C++ [temp.names]p3: 23249261Sdim // [...] When parsing a template-argument-list, the first 24249261Sdim // non-nested > is taken as the ending delimiter rather than a 25249261Sdim // greater-than operator. [...] 26249261Sdim if (GreaterThanIsOperator) 27249261Sdim return prec::Relational; 28249261Sdim return prec::Unknown; 29249261Sdim 30249261Sdim case tok::greatergreater: 31263508Sdim // C++11 [temp.names]p3: 32249261Sdim // 33249261Sdim // [...] Similarly, the first non-nested >> is treated as two 34249261Sdim // consecutive but distinct > tokens, the first of which is 35249261Sdim // taken as the end of the template-argument-list and completes 36249261Sdim // the template-id. [...] 37249261Sdim if (GreaterThanIsOperator || !CPlusPlus11) 38249261Sdim return prec::Shift; 39249261Sdim return prec::Unknown; 40249261Sdim 41249261Sdim default: return prec::Unknown; 42249261Sdim case tok::comma: return prec::Comma; 43249261Sdim case tok::equal: 44249261Sdim case tok::starequal: 45249261Sdim case tok::slashequal: 46249261Sdim case tok::percentequal: 47249261Sdim case tok::plusequal: 48249261Sdim case tok::minusequal: 49249261Sdim case tok::lesslessequal: 50249261Sdim case tok::greatergreaterequal: 51249261Sdim case tok::ampequal: 52249261Sdim case tok::caretequal: 53249261Sdim case tok::pipeequal: return prec::Assignment; 54249261Sdim case tok::question: return prec::Conditional; 55249261Sdim case tok::pipepipe: return prec::LogicalOr; 56249261Sdim case tok::ampamp: return prec::LogicalAnd; 57249261Sdim case tok::pipe: return prec::InclusiveOr; 58249261Sdim case tok::caret: return prec::ExclusiveOr; 59249261Sdim case tok::amp: return prec::And; 60249261Sdim case tok::exclaimequal: 61249261Sdim case tok::equalequal: return prec::Equality; 62249261Sdim case tok::lessequal: 63249261Sdim case tok::less: 64249261Sdim case tok::greaterequal: return prec::Relational; 65249261Sdim case tok::lessless: return prec::Shift; 66249261Sdim case tok::plus: 67249261Sdim case tok::minus: return prec::Additive; 68249261Sdim case tok::percent: 69249261Sdim case tok::slash: 70249261Sdim case tok::star: return prec::Multiplicative; 71249261Sdim case tok::periodstar: 72249261Sdim case tok::arrowstar: return prec::PointerToMember; 73249261Sdim } 74249261Sdim} 75249261Sdim 76249261Sdim} // namespace clang 77