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 Jasper prec::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