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 Andricprec::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