brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 2ec9e96 Raw
74 lines · cpp
1// RUN: %clang_analyze_cc1 -std=c++2b -verify %s \2// RUN:   -analyzer-checker=core,debug.ExprInspection3 4template <typename T> void clang_analyzer_dump(T);5 6struct S {7  int num;8  S *orig;9 10  void a(this auto Self) {11    clang_analyzer_dump(&Self);     // expected-warning {{&Self}}12    clang_analyzer_dump(Self.orig); // expected-warning {{&s}}13    clang_analyzer_dump(Self.num);       // expected-warning {{5 S32b}}14    clang_analyzer_dump(Self.orig->num); // expected-warning {{5 S32b}}15 16    Self.num = 1;17    clang_analyzer_dump(Self.num);       // expected-warning {{1 S32b}}18    clang_analyzer_dump(Self.orig->num); // expected-warning {{5 S32b}}19  }20 21  void b(this auto& Self) {22    clang_analyzer_dump(&Self);     // expected-warning {{&s}}23    clang_analyzer_dump(Self.orig); // expected-warning {{&s}}24    clang_analyzer_dump(Self.num);       // expected-warning {{5 S32b}}25    clang_analyzer_dump(Self.orig->num); // expected-warning {{5 S32b}}26 27    Self.num = 2;28    clang_analyzer_dump(Self.num);       // expected-warning {{2 S32b}}29    clang_analyzer_dump(Self.orig->num); // expected-warning {{2 S32b}}30  }31 32  void c(this S Self) {33    clang_analyzer_dump(&Self);     // expected-warning {{&Self}}34    clang_analyzer_dump(Self.orig); // expected-warning {{&s}}35    clang_analyzer_dump(Self.num);       // expected-warning {{2 S32b}}36    clang_analyzer_dump(Self.orig->num); // expected-warning {{2 S32b}}37 38    Self.num = 3;39    clang_analyzer_dump(Self.num);       // expected-warning {{3 S32b}}40    clang_analyzer_dump(Self.orig->num); // expected-warning {{2 S32b}}41  }42 43  void c(this S Self, int I) {44    clang_analyzer_dump(I); // expected-warning {{11 S32b}}45    clang_analyzer_dump(&Self);     // expected-warning {{&Self}}46    clang_analyzer_dump(Self.orig); // expected-warning {{&s}}47    clang_analyzer_dump(Self.num);       // expected-warning {{2 S32b}}48    clang_analyzer_dump(Self.orig->num); // expected-warning {{2 S32b}}49 50    Self.num = 4;51    clang_analyzer_dump(Self.num);       // expected-warning {{4 S32b}}52    clang_analyzer_dump(Self.orig->num); // expected-warning {{2 S32b}}53  }54};55 56void top() {57  S s = {/*num=*/5, /*orig=*/&s};58  s.a();59  s.b(); // This call changes 's.num' to 2.60  s.c();61  s.c(11);62}63 64 65struct S2 {66  bool operator==(this auto, S2) {67    return true;68  }69};70void use_deducing_this() {71  int result = S2{} == S2{}; // no-crash72  clang_analyzer_dump(result); // expected-warning {{1 S32b}}73}74