1139f7f9bSDimitry Andric //===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===//
2139f7f9bSDimitry Andric //
3139f7f9bSDimitry Andric //                     The LLVM Compiler Infrastructure
4139f7f9bSDimitry Andric //
5139f7f9bSDimitry Andric // This file is distributed under the University of Illinois Open Source
6139f7f9bSDimitry Andric // License. See LICENSE.TXT for details.
7139f7f9bSDimitry Andric //
8139f7f9bSDimitry Andric //===----------------------------------------------------------------------===//
9139f7f9bSDimitry Andric ///
10139f7f9bSDimitry Andric /// \file
11*4ba319b5SDimitry Andric /// Defines and computes precedence levels for binary/ternary operators.
12139f7f9bSDimitry Andric ///
13139f7f9bSDimitry Andric //===----------------------------------------------------------------------===//
14139f7f9bSDimitry Andric #include "clang/Basic/OperatorPrecedence.h"
15139f7f9bSDimitry Andric 
16139f7f9bSDimitry Andric namespace clang {
17139f7f9bSDimitry Andric 
getBinOpPrecedence(tok::TokenKind Kind,bool GreaterThanIsOperator,bool CPlusPlus11)18139f7f9bSDimitry Andric prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator,
19139f7f9bSDimitry Andric                                bool CPlusPlus11) {
20139f7f9bSDimitry Andric   switch (Kind) {
21139f7f9bSDimitry Andric   case tok::greater:
22139f7f9bSDimitry Andric     // C++ [temp.names]p3:
23139f7f9bSDimitry Andric     //   [...] When parsing a template-argument-list, the first
24139f7f9bSDimitry Andric     //   non-nested > is taken as the ending delimiter rather than a
25139f7f9bSDimitry Andric     //   greater-than operator. [...]
26139f7f9bSDimitry Andric     if (GreaterThanIsOperator)
27139f7f9bSDimitry Andric       return prec::Relational;
28139f7f9bSDimitry Andric     return prec::Unknown;
29139f7f9bSDimitry Andric 
30139f7f9bSDimitry Andric   case tok::greatergreater:
31f785676fSDimitry Andric     // C++11 [temp.names]p3:
32139f7f9bSDimitry Andric     //
33139f7f9bSDimitry Andric     //   [...] Similarly, the first non-nested >> is treated as two
34139f7f9bSDimitry Andric     //   consecutive but distinct > tokens, the first of which is
35139f7f9bSDimitry Andric     //   taken as the end of the template-argument-list and completes
36139f7f9bSDimitry Andric     //   the template-id. [...]
37139f7f9bSDimitry Andric     if (GreaterThanIsOperator || !CPlusPlus11)
38139f7f9bSDimitry Andric       return prec::Shift;
39139f7f9bSDimitry Andric     return prec::Unknown;
40139f7f9bSDimitry Andric 
41139f7f9bSDimitry Andric   default:                        return prec::Unknown;
42139f7f9bSDimitry Andric   case tok::comma:                return prec::Comma;
43139f7f9bSDimitry Andric   case tok::equal:
44139f7f9bSDimitry Andric   case tok::starequal:
45139f7f9bSDimitry Andric   case tok::slashequal:
46139f7f9bSDimitry Andric   case tok::percentequal:
47139f7f9bSDimitry Andric   case tok::plusequal:
48139f7f9bSDimitry Andric   case tok::minusequal:
49139f7f9bSDimitry Andric   case tok::lesslessequal:
50139f7f9bSDimitry Andric   case tok::greatergreaterequal:
51139f7f9bSDimitry Andric   case tok::ampequal:
52139f7f9bSDimitry Andric   case tok::caretequal:
53139f7f9bSDimitry Andric   case tok::pipeequal:            return prec::Assignment;
54139f7f9bSDimitry Andric   case tok::question:             return prec::Conditional;
55139f7f9bSDimitry Andric   case tok::pipepipe:             return prec::LogicalOr;
56e7145dcbSDimitry Andric   case tok::caretcaret:
57139f7f9bSDimitry Andric   case tok::ampamp:               return prec::LogicalAnd;
58139f7f9bSDimitry Andric   case tok::pipe:                 return prec::InclusiveOr;
59139f7f9bSDimitry Andric   case tok::caret:                return prec::ExclusiveOr;
60139f7f9bSDimitry Andric   case tok::amp:                  return prec::And;
61139f7f9bSDimitry Andric   case tok::exclaimequal:
62139f7f9bSDimitry Andric   case tok::equalequal:           return prec::Equality;
63139f7f9bSDimitry Andric   case tok::lessequal:
64139f7f9bSDimitry Andric   case tok::less:
65139f7f9bSDimitry Andric   case tok::greaterequal:         return prec::Relational;
669a199699SDimitry Andric   case tok::spaceship:            return prec::Spaceship;
67139f7f9bSDimitry Andric   case tok::lessless:             return prec::Shift;
68139f7f9bSDimitry Andric   case tok::plus:
69139f7f9bSDimitry Andric   case tok::minus:                return prec::Additive;
70139f7f9bSDimitry Andric   case tok::percent:
71139f7f9bSDimitry Andric   case tok::slash:
72139f7f9bSDimitry Andric   case tok::star:                 return prec::Multiplicative;
73139f7f9bSDimitry Andric   case tok::periodstar:
74139f7f9bSDimitry Andric   case tok::arrowstar:            return prec::PointerToMember;
75139f7f9bSDimitry Andric   }
76139f7f9bSDimitry Andric }
77139f7f9bSDimitry Andric 
78139f7f9bSDimitry Andric }  // namespace clang
79