/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/lib/Basic/OperatorPrecedence.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | /// |
9 | | /// \file |
10 | | /// Defines and computes precedence levels for binary/ternary operators. |
11 | | /// |
12 | | //===----------------------------------------------------------------------===// |
13 | | #include "clang/Basic/OperatorPrecedence.h" |
14 | | |
15 | | namespace clang { |
16 | | |
17 | | prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, |
18 | 51.6M | bool CPlusPlus11) { |
19 | 51.6M | switch (Kind) { |
20 | 724k | case tok::greater: |
21 | | // C++ [temp.names]p3: |
22 | | // [...] When parsing a template-argument-list, the first |
23 | | // non-nested > is taken as the ending delimiter rather than a |
24 | | // greater-than operator. [...] |
25 | 724k | if (GreaterThanIsOperator) |
26 | 154k | return prec::Relational; |
27 | 570k | return prec::Unknown; |
28 | | |
29 | 60.6k | case tok::greatergreater: |
30 | | // C++11 [temp.names]p3: |
31 | | // |
32 | | // [...] Similarly, the first non-nested >> is treated as two |
33 | | // consecutive but distinct > tokens, the first of which is |
34 | | // taken as the end of the template-argument-list and completes |
35 | | // the template-id. [...] |
36 | 60.6k | if (GreaterThanIsOperator || !CPlusPlus113.77k ) |
37 | 56.8k | return prec::Shift; |
38 | 3.76k | return prec::Unknown; |
39 | | |
40 | 34.9M | default: return prec::Unknown; |
41 | 11.0M | case tok::comma: return prec::Comma; |
42 | 1.53M | case tok::equal: |
43 | 1.53M | case tok::starequal: |
44 | 1.54M | case tok::slashequal: |
45 | 1.54M | case tok::percentequal: |
46 | 1.61M | case tok::plusequal: |
47 | 1.64M | case tok::minusequal: |
48 | 1.64M | case tok::lesslessequal: |
49 | 1.65M | case tok::greatergreaterequal: |
50 | 1.66M | case tok::ampequal: |
51 | 1.67M | case tok::caretequal: |
52 | 1.70M | case tok::pipeequal: return prec::Assignment; |
53 | 71.7k | case tok::question: return prec::Conditional; |
54 | 92.0k | case tok::pipepipe: return prec::LogicalOr; |
55 | 2 | case tok::caretcaret: |
56 | 242k | case tok::ampamp: return prec::LogicalAnd; |
57 | 100k | case tok::pipe: return prec::InclusiveOr; |
58 | 22.7k | case tok::caret: return prec::ExclusiveOr; |
59 | 127k | case tok::amp: return prec::And; |
60 | 232k | case tok::exclaimequal: |
61 | 558k | case tok::equalequal: return prec::Equality; |
62 | 56.9k | case tok::lessequal: |
63 | 392k | case tok::less: |
64 | 455k | case tok::greaterequal: return prec::Relational; |
65 | 838 | case tok::spaceship: return prec::Spaceship; |
66 | 288k | case tok::lessless: return prec::Shift; |
67 | 573k | case tok::plus: |
68 | 891k | case tok::minus: return prec::Additive; |
69 | 22.1k | case tok::percent: |
70 | 120k | case tok::slash: |
71 | 286k | case tok::star: return prec::Multiplicative; |
72 | 11.1k | case tok::periodstar: |
73 | 13.3k | case tok::arrowstar: return prec::PointerToMember; |
74 | 51.6M | } |
75 | 51.6M | } |
76 | | |
77 | | } // namespace clang |