cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
422 lines
14 KiB
C++
422 lines
14 KiB
C++
// RUN: %clang_cc1 -std=c++98 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
|
|
// RUN: %clang_cc1 -std=c++11 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
|
|
// RUN: %clang_cc1 -std=c++14 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
|
|
// RUN: %clang_cc1 -std=c++17 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
|
|
// RUN: %clang_cc1 -std=c++20 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
|
|
|
|
// Check -ffinite-loops option in combination with various standard versions.
|
|
// RUN: %clang_cc1 -std=c++98 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=FINITE %s
|
|
// RUN: %clang_cc1 -std=c++11 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
|
|
// RUN: %clang_cc1 -std=c++14 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
|
|
// RUN: %clang_cc1 -std=c++17 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
|
|
// RUN: %clang_cc1 -std=c++20 -ffinite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX11 %s
|
|
|
|
// Check -fno-finite-loops option in combination with various standard versions.
|
|
// RUN: %clang_cc1 -std=c++98 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
|
|
// RUN: %clang_cc1 -std=c++11 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
|
|
// RUN: %clang_cc1 -std=c++14 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
|
|
// RUN: %clang_cc1 -std=c++17 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
|
|
// RUN: %clang_cc1 -std=c++20 -fno-finite-loops -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK --check-prefix=CXX98 %s
|
|
|
|
int a = 0;
|
|
int b = 0;
|
|
|
|
// CHECK: datalayout
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2f0v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %for.cond
|
|
// CHECK: for.cond:
|
|
// CXX98-NOT: br {{.*}} llvm.loop
|
|
// CXX11-NOT: br {{.*}} llvm.loop
|
|
// FINITE-NOT: br {{.*}} llvm.loop
|
|
void f0() {
|
|
for (; ;) ;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2f1v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %for.cond
|
|
// CHECK: for.cond:
|
|
// CHECK-NEXT: br i1 true, label %for.body, label %for.end
|
|
// CHECK: for.body:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}} llvm.loop
|
|
// FINITE-NOT: br {{.*}} llvm.loop
|
|
// CHECK: for.end:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void f1() {
|
|
for (; 1;)
|
|
;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2f2v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %for.cond
|
|
// CHECK: for.cond:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: br i1 [[CMP]], label %for.body, label %for.end
|
|
// CHECK: for.body:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11: br label %for.cond, !llvm.loop [[LOOP3:!.*]]
|
|
// FINITE-NEXT: br label %for.cond, !llvm.loop [[LOOP3:!.*]]
|
|
// CHECK: for.end:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void f2() {
|
|
for (; a == b;)
|
|
;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z1Fv(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %for.cond
|
|
// CHECK: for.cond:
|
|
// CHECK-NEXT: br i1 true, label %for.body, label %for.end
|
|
// CHECK: for.body:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
// CHECK: for.end:
|
|
// CHECK-NEXT: br label %for.cond1
|
|
// CHECK: for.cond1:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: br i1 [[CMP]], label %for.body2, label %for.end3
|
|
// CHECK: for.body2:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NEXT: br label %for.cond1, !llvm.loop [[LOOP5:!.*]]
|
|
// FINITE-NEXT: br label %for.cond1, !llvm.loop [[LOOP5:!.*]]
|
|
// CHECK: for.end3:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void F() {
|
|
for (; 1;)
|
|
;
|
|
for (; a == b;)
|
|
;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2F2v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %for.cond
|
|
// CHECK: for.cond:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: br i1 [[CMP]], label %for.body, label %for.end
|
|
// CHECK: for.body:
|
|
// CXX98-NOT: br {{.*}} !llvm.loop
|
|
// CXX11-NEXT: br label %for.cond, !llvm.loop [[LOOP6:!.*]]
|
|
// FINITE-NEXT: br label %for.cond, !llvm.loop [[LOOP6:!.*]]
|
|
// CHECK: for.end:
|
|
// CHECK-NEXT: br label %for.cond1
|
|
// CHECK: for.cond1:
|
|
// CHECK-NEXT: br i1 true, label %for.body2, label %for.end3
|
|
// CHECK: for.body2:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
// CHECK: for.end3:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void F2() {
|
|
for (; a == b;)
|
|
;
|
|
for (; 1;)
|
|
;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2w1v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %while.body
|
|
// CHECK: while.body:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
//
|
|
void w1() {
|
|
while (1)
|
|
;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2w2v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %while.cond
|
|
// CHECK: while.cond:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end
|
|
// CHECK: while.body:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NEXT: br label %while.cond, !llvm.loop [[LOOP9:!.*]]
|
|
// FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP9:!.*]]
|
|
// CHECK: while.end:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void w2() {
|
|
while (a == b)
|
|
;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z1Wv(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %while.cond
|
|
// CHECK: while.cond:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: br i1 [[CMP]], label %while.body, label %while.end
|
|
// CHECK: while.body:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NEXT: br label %while.cond, !llvm.loop [[LOOP10:!.*]]
|
|
// FINITE-NEXT: br label %while.cond, !llvm.loop [[LOOP10:!.*]]
|
|
// CHECK: while.end:
|
|
// CHECK-NEXT: br label %while.body2
|
|
// CHECK: while.body2:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
//
|
|
void W() {
|
|
while (a == b)
|
|
;
|
|
while (1)
|
|
;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2W2v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %while.body
|
|
// CHECK: while.body:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
//
|
|
void W2() {
|
|
while (1)
|
|
;
|
|
while (a == b)
|
|
;
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2d1v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %do.body
|
|
// CHECK: do.body:
|
|
// CHECK-NEXT: br label %do.cond
|
|
// CHECK: do.cond:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
// CHECK: do.end:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void d1() {
|
|
do
|
|
;
|
|
while (1);
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2d2v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %do.body
|
|
// CHECK: do.body:
|
|
// CHECK-NEXT: br label %do.cond
|
|
// CHECK: do.cond:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP14:!.*]]
|
|
// FINITE-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP14:!.*]]
|
|
// CHECK: do.end:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void d2() {
|
|
do
|
|
;
|
|
while (a == b);
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z1Dv(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %do.body
|
|
// CHECK: do.body:
|
|
// CHECK-NEXT: br label %do.cond
|
|
// CHECK: do.cond:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
// CHECK: do.end:
|
|
// CHECK-NEXT: br label %do.body1
|
|
// CHECK: do.body1:
|
|
// CHECK-NEXT: br label %do.cond2
|
|
// CHECK: do.cond2:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NEXT: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP16:!.*]]
|
|
// FINITE-NEXT: br i1 [[CMP]], label %do.body1, label %do.end3, !llvm.loop [[LOOP16:!.*]]
|
|
// CHECK: do.end3:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void D() {
|
|
do
|
|
;
|
|
while (1);
|
|
do
|
|
;
|
|
while (a == b);
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z2D2v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %do.body
|
|
// CHECK: do.body:
|
|
// CHECK-NEXT: br label %do.cond
|
|
// CHECK: do.cond:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4
|
|
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP17:!.*]]
|
|
// FINITE-NEXT: br i1 [[CMP]], label %do.body, label %do.end, !llvm.loop [[LOOP17:!.*]]
|
|
// CHECK: do.end:
|
|
// CHECK-NEXT: br label %do.body1
|
|
// CHECK: do.body1:
|
|
// CHECK-NEXT: br label %do.cond2
|
|
// CHECK: do.cond2:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
// CHECK: do.end3:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void D2() {
|
|
do
|
|
;
|
|
while (a == b);
|
|
do
|
|
;
|
|
while (1);
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z9compound0v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %for.cond
|
|
// CHECK: for.cond:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
void compound0() {
|
|
for (; ;) {}
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z9compound1v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %for.cond
|
|
// CHECK: for.cond:
|
|
// CXX98-NOT: br {{.*}}, llvm.loop
|
|
// CXX11-NOT: br {{.*}}, llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
void compound1() {
|
|
for (; ;) {/*! */}
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11-NOT: mustprogress
|
|
// FINITE-NOT: mustprogress
|
|
// CHECK-LABEL: @_Z9compound2v(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %do.body
|
|
// CHECK: do.body:
|
|
// CHECK-NEXT: br label %do.cond
|
|
// CHECK: do.cond:
|
|
// CXX98-NOT: br {{.*}}, !llvm.loop
|
|
// CXX11-NOT: br {{.*}}, !llvm.loop
|
|
// FINITE-NOT: br {{.*}}, !llvm.loop
|
|
// CHECK: do.end:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void compound2() {
|
|
do {} while (1+1);
|
|
}
|
|
|
|
// CXX98-NOT: mustprogress
|
|
// CXX11 : mustprogress
|
|
// FINITE : mustprogress
|
|
// CHECK-LABEL: @_Z5Falsev(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: br label %do.body
|
|
// CHECK: do.body:
|
|
// CHECK-NEXT: br label %do.end
|
|
// CHECK: do.end:
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void False() {
|
|
do {} while (1-1);
|
|
}
|
|
|
|
|
|
// CXX11: [[LOOP3]] = distinct !{[[LOOP3]], [[MP:.*]]}
|
|
// CXX11: [[MP]] = !{!"llvm.loop.mustprogress"}
|
|
// CXX11: [[LOOP5]] = distinct !{[[LOOP5]], [[MP]]}
|
|
// CXX11: [[LOOP6]] = distinct !{[[LOOP6]], [[MP]]}
|
|
// CXX11: [[LOOP9]] = distinct !{[[LOOP9]], [[MP]]}
|
|
// CXX11: [[LOOP10]] = distinct !{[[LOOP10]], [[MP]]}
|
|
// CXX11: [[LOOP14]] = distinct !{[[LOOP14]], [[MP]]}
|
|
// CXX11: [[LOOP16]] = distinct !{[[LOOP16]], [[MP]]}
|
|
// CXX11: [[LOOP17]] = distinct !{[[LOOP17]], [[MP]]}
|