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