conditional-gnu-ext.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
  2. // rdar: // 8353567
  3. // pr7726
  4. extern "C" int printf(...);
  5. void test0() {
  6. // CHECK: call i32 (...) @printf({{.*}}, i8* inttoptr (i64 3735928559 to i8*))
  7. printf("%p\n", (void *)0xdeadbeef ? : (void *)0xaaaaaa);
  8. }
  9. // rdar://8446940
  10. namespace radar8446940 {
  11. extern "C" void abort();
  12. int main () {
  13. char x[1];
  14. char *y = x ? : 0;
  15. if (x != y)
  16. abort();
  17. }
  18. }
  19. namespace radar8453812 {
  20. extern "C" void abort();
  21. _Complex int getComplex(_Complex int val) {
  22. static int count;
  23. if (count++)
  24. abort();
  25. return val;
  26. }
  27. _Complex int cmplx() {
  28. _Complex int cond;
  29. _Complex int rhs;
  30. return getComplex(1+2i) ? : rhs;
  31. }
  32. // lvalue test
  33. void foo (int& lv) {
  34. ++lv;
  35. }
  36. int global = 1;
  37. int &cond() {
  38. static int count;
  39. if (count++)
  40. abort();
  41. return global;
  42. }
  43. int main() {
  44. cmplx();
  45. int rhs = 10;
  46. foo (cond()? : rhs);
  47. return global-2;
  48. }
  49. }
  50. namespace test3 {
  51. struct A {
  52. A();
  53. A(const A&);
  54. ~A();
  55. };
  56. struct B {
  57. B();
  58. B(const B&);
  59. ~B();
  60. operator bool();
  61. operator A();
  62. };
  63. B test0(B &x) {
  64. // CHECK-LABEL: define void @_ZN5test35test0ERNS_1BE(
  65. // CHECK: [[X:%.*]] = alloca [[B:%.*]]*,
  66. // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
  67. // CHECK-NEXT: [[T0:%.*]] = load [[B]]*, [[B]]** [[X]]
  68. // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
  69. // CHECK-NEXT: br i1 [[BOOL]]
  70. // CHECK: call void @_ZN5test31BC1ERKS0_([[B]]* noalias [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[T0]])
  71. // CHECK-NEXT: br label
  72. // CHECK: call void @_ZN5test31BC1Ev([[B]]* noalias [[RESULT]])
  73. // CHECK-NEXT: br label
  74. // CHECK: ret void
  75. return x ?: B();
  76. }
  77. B test1() {
  78. // CHECK-LABEL: define void @_ZN5test35test1Ev(
  79. // CHECK: [[TEMP:%.*]] = alloca [[B]],
  80. // CHECK-NEXT: call void @_ZN5test312test1_helperEv([[B]]* sret [[TEMP]])
  81. // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
  82. // CHECK-NEXT: br i1 [[BOOL]]
  83. // CHECK: call void @_ZN5test31BC1ERKS0_([[B]]* noalias [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[TEMP]])
  84. // CHECK-NEXT: br label
  85. // CHECK: call void @_ZN5test31BC1Ev([[B]]* noalias [[RESULT]])
  86. // CHECK-NEXT: br label
  87. // CHECK: call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
  88. // CHECK-NEXT: ret void
  89. extern B test1_helper();
  90. return test1_helper() ?: B();
  91. }
  92. A test2(B &x) {
  93. // CHECK-LABEL: define void @_ZN5test35test2ERNS_1BE(
  94. // CHECK: [[X:%.*]] = alloca [[B]]*,
  95. // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
  96. // CHECK-NEXT: [[T0:%.*]] = load [[B]]*, [[B]]** [[X]]
  97. // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
  98. // CHECK-NEXT: br i1 [[BOOL]]
  99. // CHECK: call void @_ZN5test31BcvNS_1AEEv([[A:%.*]]* sret [[RESULT:%.*]], [[B]]* [[T0]])
  100. // CHECK-NEXT: br label
  101. // CHECK: call void @_ZN5test31AC1Ev([[A]]* noalias [[RESULT]])
  102. // CHECK-NEXT: br label
  103. // CHECK: ret void
  104. return x ?: A();
  105. }
  106. A test3() {
  107. // CHECK-LABEL: define void @_ZN5test35test3Ev(
  108. // CHECK: [[TEMP:%.*]] = alloca [[B]],
  109. // CHECK-NEXT: call void @_ZN5test312test3_helperEv([[B]]* sret [[TEMP]])
  110. // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
  111. // CHECK-NEXT: br i1 [[BOOL]]
  112. // CHECK: call void @_ZN5test31BcvNS_1AEEv([[A]]* sret [[RESULT:%.*]], [[B]]* [[TEMP]])
  113. // CHECK-NEXT: br label
  114. // CHECK: call void @_ZN5test31AC1Ev([[A]]* noalias [[RESULT]])
  115. // CHECK-NEXT: br label
  116. // CHECK: call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
  117. // CHECK-NEXT: ret void
  118. extern B test3_helper();
  119. return test3_helper() ?: A();
  120. }
  121. }
  122. namespace test4 {
  123. // Make sure this doesn't crash.
  124. void f() {
  125. const int a = 10, b = 20;
  126. const int *c = &(a ?: b);
  127. }
  128. }