mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 04:16:46 +00:00

Because they are the last two remaining test files that appeared under `clang/test/Analysis` but were unrelated to the clang static analyzer. For background see the following discourse thread: https://discourse.llvm.org/t/taking-ownership-of-clang-test-analysis/84689/2 I placed them in in `clang/test/SemaCXX` because they are testing the `-Wuninitialized` warning family and the other tests of this feature can be found there (or in `Sema`, `SemaObjC` depending on the language). Note that `clang/test/Analysis` contains many other test files named `uninit-*`, but those test the uninitialized value handling of the clang static analyzer, which is independent of the (non-path-sensitive) compiler warnings that are tested in the two files that I'm moving. Also note that the implementation of the `-Wuninitialized`-like warnings relies on the source files `clang/lib/Analysis/UninitializedValues.cpp` and `clang/lib/Sema/AnalysisBasedWarnings.cpp`, and this would theoretically justify leaving their tests in the "Analysis" directory; but in practice the "Analysis" directory is almost exclusively used by the static analyzer, so I still decided to relocate these two tests for the sake of consistency.
110 lines
1.9 KiB
C++
110 lines
1.9 KiB
C++
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++11 -Wuninitialized -verify %s
|
|
|
|
// test1: Expect no diagnostics
|
|
int test1(int x) {
|
|
int y;
|
|
asm goto("" : "=r"(y) : "r"(x) : : err);
|
|
return y;
|
|
err:
|
|
return -1;
|
|
}
|
|
|
|
// test2: Expect no diagnostics
|
|
int test2(int x) {
|
|
int y;
|
|
if (x < 42)
|
|
asm goto("" : "+S"(x), "+D"(y) : "r"(x) :: indirect_1, indirect_2);
|
|
else
|
|
asm goto("" : "+S"(x), "+D"(y) : "r"(x), "r"(y) :: indirect_1, indirect_2);
|
|
return x + y;
|
|
indirect_1:
|
|
return -42;
|
|
indirect_2:
|
|
return y;
|
|
}
|
|
|
|
// test3: Expect no diagnostics
|
|
int test3(int x) {
|
|
int y;
|
|
asm goto("" : "=&r"(y) : "r"(x) : : fail);
|
|
normal:
|
|
y += x;
|
|
return y;
|
|
if (x) {
|
|
fail:
|
|
return y;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// test4: Expect no diagnostics
|
|
int test4(int x) {
|
|
int y;
|
|
goto forward;
|
|
backward:
|
|
return y;
|
|
forward:
|
|
asm goto("" : "=r"(y) : "r"(x) : : backward);
|
|
return y;
|
|
}
|
|
|
|
// test5: Expect no diagnostics
|
|
int test5(int x) {
|
|
int y;
|
|
asm goto("" : "+S"(x), "+D"(y) : "r"(x) :: indirect, fallthrough);
|
|
fallthrough:
|
|
return y;
|
|
indirect:
|
|
return -2;
|
|
}
|
|
|
|
// test6: Expect no diagnostics.
|
|
int test6(unsigned int *x) {
|
|
unsigned int val;
|
|
|
|
// See through casts and unary operators.
|
|
asm goto("" : "=r" (*(unsigned int *)(&val)) ::: indirect);
|
|
*x = val;
|
|
return 0;
|
|
indirect:
|
|
return -1;
|
|
}
|
|
|
|
// test7: Expect no diagnostics.
|
|
int test7(int z) {
|
|
int x;
|
|
if (z)
|
|
asm goto ("":"=r"(x):::A1,A2);
|
|
return 0;
|
|
A1:
|
|
A2:
|
|
return x;
|
|
}
|
|
|
|
// test8: Expect no diagnostics
|
|
int test8() {
|
|
int x = 0;
|
|
asm goto ("":"=r"(x):::A1,A2);
|
|
return 0;
|
|
A1:
|
|
A2:
|
|
return x;
|
|
}
|
|
|
|
// test9: Expect no diagnostics
|
|
int test9 (int x) {
|
|
int y;
|
|
asm goto("": "=r"(y) :::out);
|
|
return 42;
|
|
out:
|
|
return y;
|
|
}
|
|
|
|
int test10() {
|
|
int y; // expected-note {{initialize the variable 'y' to silence this warning}}
|
|
asm goto(""::::out);
|
|
return 42;
|
|
out:
|
|
return y; // expected-warning {{variable 'y' is uninitialized when used here}}
|
|
}
|