brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 642d62f Raw
177 lines · cpp
1// RUN: %clang_cc1 %s -std=c++17 -fsyntax-only -verify2// RUN: %clang_cc1 %s -DPEDANTIC -pedantic -fsyntax-only -verify3 4#if PEDANTIC5void g() {6  if (true)7    [[likely]] {} // expected-warning {{use of the 'likely' attribute is a C++20 extension}}8  else9    [[unlikely]] {} // expected-warning {{use of the 'unlikely' attribute is a C++20 extension}}10}11#else12void a() {13  if (true)14    [[likely]]; // expected-warning {{conflicting attributes 'likely' are ignored}}15  else16    [[likely]]; // expected-note {{conflicting attribute is here}}17}18 19void b() {20  if (true)21    [[unlikely]]; // expected-warning {{conflicting attributes 'unlikely' are ignored}}22  else23    [[unlikely]]; // expected-note {{conflicting attribute is here}}24}25 26void c() {27  if (true)28    [[likely]];29}30 31void d() {32  if (true)33    [[unlikely]];34}35 36void g() {37  if (true)38    [[likely]] {}39  else40    [[unlikely]] {}41}42 43void h() {44  if (true)45    [[likely]] {}46  else {47  }48}49 50void i() {51  if (true)52    [[unlikely]] {}53  else {54  }55}56 57void j() {58  if (true) {59  } else60    [[likely]] {}61}62 63void k() {64  if (true) {65  } else66    [[likely]] {}67}68 69void l() {70  if (true)71    [[likely]] {}72  else73    [[unlikely]] if (false) [[likely]] {}74}75 76void m() {77  [[likely]] int x = 42; // expected-error {{'likely' attribute cannot be applied to a declaration}}78 79  if (x)80    [[unlikely]] {}81  if (x) {82    [[unlikely]];83  }84  switch (x) {85  case 1:86    [[likely]] {}87    break;88    [[likely]] case 2 : case 3 : {}89    break;90  }91 92  do {93    [[unlikely]];94  } while (x);95  do96    [[unlikely]] {}97  while (x);98  do { // expected-note {{to match this 'do'}}99  }100  [[unlikely]] while (x); // expected-error {{expected 'while' in do/while loop}}101  for (;;)102    [[unlikely]] {}103  for (;;) {104    [[unlikely]];105  }106  while (x)107    [[unlikely]] {}108  while (x) {109    [[unlikely]];110  }111 112  switch (x)113    [[unlikely]] {}114 115  if (x)116    goto lbl;117 118  // FIXME: allow the attribute on the label119  [[unlikely]] lbl : // expected-error {{'unlikely' attribute cannot be applied to a declaration}}120                     [[likely]] x = x + 1;121 122  [[likely]]++ x;123}124 125void n() [[likely]] // expected-error {{'likely' attribute cannot be applied to types}}126{127  try128    [[likely]] {} // expected-error {{expected '{'}}129  catch (...) [[likely]] { // expected-error {{expected expression}}130  }131}132 133void o()134{135  // expected-warning@+2 {{attribute 'likely' has no effect when annotating an 'if constexpr' statement}}136  // expected-note@+1 {{annotating the 'if constexpr' statement here}}137  if constexpr (true) [[likely]];138 139  // expected-note@+1 {{annotating the 'if constexpr' statement here}}140  if constexpr (true) {141  // expected-warning@+1 {{attribute 'unlikely' has no effect when annotating an 'if constexpr' statement}}142  } else [[unlikely]];143 144  // Annotating both branches with conflicting likelihoods generates no diagnostic regarding the conflict.145  // expected-warning@+2 {{attribute 'likely' has no effect when annotating an 'if constexpr' statement}}146  // expected-note@+1 2 {{annotating the 'if constexpr' statement here}}147  if constexpr (true) [[likely]] {148  // expected-warning@+1 {{attribute 'likely' has no effect when annotating an 'if constexpr' statement}}149  } else [[likely]];150 151  if (1) [[likely, unlikely]] { // expected-error {{'unlikely' and 'likely' attributes are not compatible}} \152                                // expected-note {{conflicting attribute is here}}153  } else [[unlikely]][[likely]] { // expected-error {{'likely' and 'unlikely' attributes are not compatible}} \154                                  // expected-note {{conflicting attribute is here}}155  }156}157 158constexpr int constexpr_function() {159  [[likely]] return 0;160}161static_assert(constexpr_function() == 0);162 163constexpr double pow(double x, long long n) noexcept {164    if (n > 0) [[likely]]165        return x * pow(x, n - 1);166    else [[unlikely]]167        return 1;168}169constexpr long long fact(long long n) noexcept {170    if (n > 1) [[likely]]171        return n * fact(n - 1);172    else [[unlikely]]173        return 1;174}175 176#endif177