xref: /llvm-project/clang/test/Modules/decl-params-determinisim.m (revision d4d95ee65159db1ea1a8c4159cfdaf8b81097897)
1/// Test determinisim when serializing anonymous decls. Create enough Decls in
2/// DeclContext that can overflow the small storage of SmallPtrSet to make sure
3/// the serialization does not rely on iteration order of SmallPtrSet.
4// RUN: rm -rf %t.dir
5// RUN: split-file %s %t.dir
6// RUN: %clang_cc1 -fmodules -fimplicit-module-maps \
7// RUN:   -fmodules-cache-path=%t.dir/cache -triple x86_64-apple-macosx10.11.0 \
8// RUN:   -I%t.dir/headers %t.dir/main.m -fdisable-module-hash -Wno-visibility
9// RUN: mv %t.dir/cache/A.pcm %t1.pcm
10/// Check the order of the decls first. If LLVM_ENABLE_REVERSE_ITERATION is on,
11/// it will fail the test early if the output is depending on the order of items
12/// in containers that has non-deterministic orders.
13// RUN: llvm-bcanalyzer --dump --disable-histogram %t1.pcm | FileCheck %s
14// RUN: rm -rf %t.dir/cache
15// RUN: %clang_cc1 -fmodules -fimplicit-module-maps \
16// RUN:   -fmodules-cache-path=%t.dir/cache -triple x86_64-apple-macosx10.11.0 \
17// RUN:   -I%t.dir/headers %t.dir/main.m -fdisable-module-hash -Wno-visibility
18// RUN: mv %t.dir/cache/A.pcm %t2.pcm
19// RUN: diff %t1.pcm %t2.pcm
20
21/// Spot check entries to make sure they are in current ordering.
22/// op6 encodes the anonymous decl number which should be in order.
23
24/// NOTE: This test case is on determinism of TypeID for function declaration.
25/// Change related to TypeID (or PredefinedTypeIDs) will affect the result and
26/// will require update for this test case. Currently, TypeID is at op6 and the
27/// test checks the IDs are in strict ordering.
28
29// CHECK: <TYPE_FUNCTION_PROTO
30// CHECK-NEXT: <DECL_PARM_VAR
31// CHECK-SAME: op5=13
32// CHECK-NEXT: <DECL_PARM_VAR
33// CHECK-SAME: op5=14
34// CHECK-NEXT: <DECL_PARM_VAR
35// CHECK-SAME: op5=15
36// CHECK-NEXT: <DECL_PARM_VAR
37// CHECK-SAME: op5=16
38
39/// Decl records start at 43
40// CHECK: <DECL_RECORD
41// CHECK-SAME: op5=54
42// CHECK-NEXT: <DECL_RECORD
43// CHECK-SAME: op5=55
44// CHECK-NEXT: <DECL_RECORD
45// CHECK-SAME: op5=56
46// CHECK-NEXT: <DECL_RECORD
47// CHECK-SAME: op5=57
48
49//--- headers/a.h
50void f(struct A0 *a0,
51       struct A1 *a1,
52       struct A2 *a2,
53       struct A3 *a3,
54       struct A4 *a4,
55       struct A5 *a5,
56       struct A6 *a6,
57       struct A7 *a7,
58       struct A8 *a8,
59       struct A9 *a9,
60       struct A10 *a10,
61       struct A11 *a11,
62       struct A12 *a12,
63       struct A13 *a13,
64       struct A14 *a14,
65       struct A15 *a15,
66       struct A16 *a16,
67       struct A17 *a17,
68       struct A18 *a18,
69       struct A19 *a19,
70       struct A20 *a20,
71       struct A21 *a21,
72       struct A22 *a22,
73       struct A23 *a23,
74       struct A24 *a24,
75       struct A25 *a25,
76       struct A26 *a26,
77       struct A27 *a27,
78       struct A28 *a28,
79       struct A29 *a29,
80       struct A30 *a30,
81       struct A31 *a31,
82       struct A32 *a32,
83       struct A33 *a33,
84       struct A34 *a34,
85       struct A35 *a35,
86       struct A36 *a36,
87       struct A37 *a37,
88       struct A38 *a38,
89       struct A39 *a39,
90       struct A40 *a40);
91
92
93//--- headers/module.modulemap
94
95module A {
96  header "a.h"
97}
98
99//--- main.m
100
101#import <a.h>
102
103