mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 23:56:06 +00:00

Now that we support outputs from asm goto along indirect edges, we can remove/revert some code that was added to help warn about the previous limitation that outputs were not supported along indirect edges. Reverts some code added in: commit 72aa619a7fe0 ("Warn of uninitialized variables on asm goto's indirect branch") commit 3a604fdbcd5f ("[Clang][CFG] check children statements of asm goto") But keeps+updates the tests. Link: https://github.com/llvm/llvm-project/issues/53562 Reviewed By: void Differential Revision: https://reviews.llvm.org/D140508
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}}
|
|
}
|