diff options
Diffstat (limited to 'clang/lib/Basic/OperatorPrecedence.cpp')
| -rw-r--r-- | clang/lib/Basic/OperatorPrecedence.cpp | 77 | 
1 files changed, 77 insertions, 0 deletions
diff --git a/clang/lib/Basic/OperatorPrecedence.cpp b/clang/lib/Basic/OperatorPrecedence.cpp new file mode 100644 index 0000000000000..02876f14291d1 --- /dev/null +++ b/clang/lib/Basic/OperatorPrecedence.cpp @@ -0,0 +1,77 @@ +//===--- 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::caretcaret: +  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  | 
