Commit 0f9c438
[CIR][IR] Relax get_member verifier for incomplete types (#269)
This is a suggestion to relax the existing verification even more than
we did it in PR #257.
Here we also skip verification if a field on the given index is also of
incomplete type - and we can not compare it with the result type of the
operation.
Now the next code fails with type mismatch error:
```
typedef struct Node {
struct Node* next;
} NodeStru;
void foo(NodeStru* a) {
a->next = 0;
}
```
because the result type is kind of full and the type of field is not
(for the reasons discussed in #256).
Basically, the problem is in the `GetMemberOp` result type generated as
following (via `CIRGenTypes::convertType`)
`!cir.ptr<!cir.struct<struct "Node" {!cir.ptr<!cir.struct<struct "Node"
incomplete #cir.record.decl.ast>>} #cir.record.decl.ast>>`
where the field type at index differs from the record type - compare
with
`!cir.ptr<!cir.struct<struct "Node" incomplete #cir.record.decl.ast>>`
We just slightly relax the previous solution in #257 - and the
compilation won't fail in the case of recursive types.
Well, if there are some other thoughts?1 parent 18a2853 commit 0f9c438
File tree
2 files changed
+28
-3
lines changed- clang
- lib/CIR/Dialect/IR
- test/CIR/CodeGen
2 files changed
+28
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2398 | 2398 | | |
2399 | 2399 | | |
2400 | 2400 | | |
| 2401 | + | |
| 2402 | + | |
| 2403 | + | |
| 2404 | + | |
| 2405 | + | |
| 2406 | + | |
| 2407 | + | |
| 2408 | + | |
2401 | 2409 | | |
2402 | 2410 | | |
2403 | 2411 | | |
| |||
2410 | 2418 | | |
2411 | 2419 | | |
2412 | 2420 | | |
2413 | | - | |
| 2421 | + | |
2414 | 2422 | | |
2415 | 2423 | | |
2416 | 2424 | | |
2417 | 2425 | | |
2418 | 2426 | | |
2419 | 2427 | | |
2420 | 2428 | | |
2421 | | - | |
2422 | | - | |
| 2429 | + | |
| 2430 | + | |
| 2431 | + | |
| 2432 | + | |
| 2433 | + | |
| 2434 | + | |
2423 | 2435 | | |
2424 | 2436 | | |
2425 | 2437 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
15 | 20 | | |
16 | 21 | | |
17 | 22 | | |
18 | 23 | | |
19 | 24 | | |
| 25 | + | |
| 26 | + | |
20 | 27 | | |
21 | 28 | | |
22 | 29 | | |
| |||
78 | 85 | | |
79 | 86 | | |
80 | 87 | | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
0 commit comments