110 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++11 -Wuninitialized -verify %s2 3// test1: Expect no diagnostics4int test1(int x) {5 int y;6 asm goto("" : "=r"(y) : "r"(x) : : err);7 return y;8 err:9 return -1;10}11 12// test2: Expect no diagnostics13int test2(int x) {14 int y;15 if (x < 42)16 asm goto("" : "+S"(x), "+D"(y) : "r"(x) :: indirect_1, indirect_2);17 else18 asm goto("" : "+S"(x), "+D"(y) : "r"(x), "r"(y) :: indirect_1, indirect_2);19 return x + y;20indirect_1:21 return -42;22indirect_2:23 return y;24}25 26// test3: Expect no diagnostics27int test3(int x) {28 int y;29 asm goto("" : "=&r"(y) : "r"(x) : : fail);30normal:31 y += x;32 return y;33 if (x) {34fail:35 return y;36 }37 return 0;38}39 40// test4: Expect no diagnostics41int test4(int x) {42 int y;43 goto forward;44backward:45 return y;46forward:47 asm goto("" : "=r"(y) : "r"(x) : : backward);48 return y;49}50 51// test5: Expect no diagnostics52int test5(int x) {53 int y;54 asm goto("" : "+S"(x), "+D"(y) : "r"(x) :: indirect, fallthrough);55fallthrough:56 return y;57indirect:58 return -2;59}60 61// test6: Expect no diagnostics.62int test6(unsigned int *x) {63 unsigned int val;64 65 // See through casts and unary operators.66 asm goto("" : "=r" (*(unsigned int *)(&val)) ::: indirect);67 *x = val;68 return 0;69indirect:70 return -1;71}72 73// test7: Expect no diagnostics.74int test7(int z) {75 int x;76 if (z)77 asm goto ("":"=r"(x):::A1,A2);78 return 0;79 A1:80 A2:81 return x;82}83 84// test8: Expect no diagnostics85int test8() {86 int x = 0;87 asm goto ("":"=r"(x):::A1,A2);88 return 0;89 A1:90 A2:91 return x;92}93 94// test9: Expect no diagnostics95int test9 (int x) {96 int y;97 asm goto("": "=r"(y) :::out);98 return 42;99out:100 return y;101}102 103int test10() {104 int y; // expected-note {{initialize the variable 'y' to silence this warning}}105 asm goto(""::::out);106 return 42;107out:108 return y; // expected-warning {{variable 'y' is uninitialized when used here}}109}110