|  | //===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | /// | 
|  | /// \file | 
|  | /// Defines and computes precedence levels for binary/ternary operators. | 
|  | /// | 
|  | //===----------------------------------------------------------------------===// | 
|  | #include "clang/Basic/OperatorPrecedence.h" | 
|  |  | 
|  | namespace clang { | 
|  |  | 
|  | prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, | 
|  | bool CPlusPlus11) { | 
|  | switch (Kind) { | 
|  | case tok::greater: | 
|  | // C++ [temp.names]p3: | 
|  | //   [...] When parsing a template-argument-list, the first | 
|  | //   non-nested > is taken as the ending delimiter rather than a | 
|  | //   greater-than operator. [...] | 
|  | if (GreaterThanIsOperator) | 
|  | return prec::Relational; | 
|  | return prec::Unknown; | 
|  |  | 
|  | case tok::greatergreater: | 
|  | // C++11 [temp.names]p3: | 
|  | // | 
|  | //   [...] Similarly, the first non-nested >> is treated as two | 
|  | //   consecutive but distinct > tokens, the first of which is | 
|  | //   taken as the end of the template-argument-list and completes | 
|  | //   the template-id. [...] | 
|  | if (GreaterThanIsOperator || !CPlusPlus11) | 
|  | return prec::Shift; | 
|  | return prec::Unknown; | 
|  |  | 
|  | default:                        return prec::Unknown; | 
|  | case tok::comma:                return prec::Comma; | 
|  | case tok::equal: | 
|  | case tok::starequal: | 
|  | case tok::slashequal: | 
|  | case tok::percentequal: | 
|  | case tok::plusequal: | 
|  | case tok::minusequal: | 
|  | case tok::lesslessequal: | 
|  | case tok::greatergreaterequal: | 
|  | case tok::ampequal: | 
|  | case tok::caretequal: | 
|  | case tok::pipeequal:            return prec::Assignment; | 
|  | case tok::question:             return prec::Conditional; | 
|  | case tok::pipepipe:             return prec::LogicalOr; | 
|  | case tok::ampamp:               return prec::LogicalAnd; | 
|  | case tok::pipe:                 return prec::InclusiveOr; | 
|  | case tok::caret:                return prec::ExclusiveOr; | 
|  | case tok::amp:                  return prec::And; | 
|  | case tok::exclaimequal: | 
|  | case tok::equalequal:           return prec::Equality; | 
|  | case tok::lessequal: | 
|  | case tok::less: | 
|  | case tok::greaterequal:         return prec::Relational; | 
|  | case tok::spaceship:            return prec::Spaceship; | 
|  | case tok::lessless:             return prec::Shift; | 
|  | case tok::plus: | 
|  | case tok::minus:                return prec::Additive; | 
|  | case tok::percent: | 
|  | case tok::slash: | 
|  | case tok::star:                 return prec::Multiplicative; | 
|  | case tok::periodstar: | 
|  | case tok::arrowstar:            return prec::PointerToMember; | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace clang |