File: p2.cpp

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-6~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,418,812 kB
  • sloc: cpp: 5,290,827; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,900; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,892; xml: 953; cs: 573; fortran: 539
file content (52 lines) | stat: -rw-r--r-- 2,729 bytes parent folder | download | duplicates (31)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// RUN: %clang_cc1 -verify %s -std=c++17 -Weverything -Wno-deprecated -Wno-float-equal
// RUN: %clang_cc1 -verify %s -std=c++2a -Wdeprecated

static enum E1 {} e1, e1b;
static enum E2 {} e2;
static double d;
extern void f();
extern bool b;

void f() {
  void(e1 * e1);
  void(e1 * e2); // expected-warning {{arithmetic between different enumeration types}}
  void(e1 * d); // expected-warning {{arithmetic between enumeration type 'enum E1' and floating-point type 'double'}}
  void(d * e1); // expected-warning {{arithmetic between floating-point type 'double' and enumeration type 'enum E1'}}

  void(e1 + e1);
  void(e1 + e2); // expected-warning {{arithmetic between different enumeration types}}
  void(e1 + d); // expected-warning {{arithmetic between enumeration type 'enum E1' and floating-point type 'double'}}
  void(d + e1); // expected-warning {{arithmetic between floating-point type 'double' and enumeration type 'enum E1'}}

#if __cplusplus > 201703L
  void(e1 <=> e1b); // expected-error {{include <compare>}}
  void(e1 <=> e2); // expected-error {{invalid operands}}
  void(e1 <=> d); // expected-error {{invalid operands}}
  void(d <=> e1); // expected-error {{invalid operands}}
#endif

  void(e1 < e1b);
  void(e1 < e2); // expected-warning {{comparison of different enumeration types}}
  void(e1 < d); // expected-warning {{comparison of enumeration type 'enum E1' with floating-point type 'double'}}
  void(d < e1); // expected-warning {{comparison of floating-point type 'double' with enumeration type 'enum E1'}}

  void(e1 == e1b);
  void(e1 == e2); // expected-warning {{comparison of different enumeration types}}
  void(e1 == d); // expected-warning {{comparison of enumeration type 'enum E1' with floating-point type 'double'}}
  void(d == e1); // expected-warning {{comparison of floating-point type 'double' with enumeration type 'enum E1'}}

  void(b ? e1 : e1b);
  void(b ? e1 : e2); // expected-warning {{conditional expression between different enumeration types}}
  void(b ? e1 : d); // expected-warning {{conditional expression between enumeration type 'enum E1' and floating-point type 'double'}}
  void(b ? d : e1); // expected-warning {{conditional expression between floating-point type 'double' and enumeration type 'enum E1'}}

  void(e1 = e1b);
  void(e1 = e2); // expected-error {{incompatible}}
  void(e1 = d); // expected-error {{incompatible}}
  void(d = e1); // FIXME: Should we warn on this?

  void(e1 += e1b); // expected-error {{incompatible}}
  void(e1 += e2); // expected-error {{incompatible}}
  void(e1 += d); // expected-error {{incompatible}}
  void(d += e1); // expected-warning {{compound assignment of floating-point type 'double' from enumeration type 'enum E1'}}
}