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