audit: 프런트엔드 빈틈 열하나와 진법 리터럴
전부 구현 쪽이었다. SPEC 은 §6.2(체이닝·단항 뒤 as), §5 R9(asm), §6.1·§7.3
(extern, 빈 enum/error)을 이미 옳게 적고 있었고 구현만 따라가지 않았다.
const A: i32 = r(); 전역 초기값에 호출. lowering 이 조용히 버리고 0
static A: i32 = r(); 같은 것을 저장소 0 으로
true == false == true 비교 체이닝
-x as u32 괄호 없이 단항 뒤 as
asm { } unsafe 밖에서
extern fn f(); ABI 문자열 없이
extern "stdcall" fn f(); c 아닌 ABI
extern "c" fn f() { } extern 에 본문
fn f() -> i32; extern 아닌데 본문 없음
enum E { } error E { } 빈 선언
FRONT-01/02 는 SPEC 에도 규칙이 없었다. §7.1 에 넣었다 -- 전역의 바이트는
이미지에 들어가므로 초기값이 실행될 순간이 없다. 리터럴과 다른 const, 배리언트,
error.Name, 그리고 그것들에 대한 연산까지가 허용된다.
-x as T 와 비교 체이닝을 잡으려면 괄호가 트리에 남아야 해서 FE_NODE_PAREN 을
두었다. 파싱 뒤에는 -x as T 와 -(x as T) 가 같은 트리다.
그리고 0b1010 이 0, 0o17 이 0 이었다. 10진으로 읽다가 b 에서 멈춰 0 을 내는데
0 도 숫자라 아무도 눈치채지 못한다. 값 계산 두 군데를 고쳤다.
262/262, 40/40.
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
- 날짜: 2026-08-17
|
||||
- 기준 커밋: `6dc298d828872409fdf6b7d2e85830f18a118d9f`
|
||||
- 범위: parser, checker, 전역 lowering의 경계
|
||||
- **해결: 11 건 전부와 `0b`/`0o` 리터럴까지. 모두 구현 쪽이었다.**
|
||||
fixture 는 아래 표에 적었다. 본문은 조사 시점 그대로다.
|
||||
|
||||
## 재현된 문제
|
||||
|
||||
@@ -25,6 +27,35 @@
|
||||
중복 struct field와 중복 enum variant 선언도 통과했지만, 중복 선언 규칙을 SPEC에서 먼저
|
||||
확정해야 하므로 위 목록에는 넣지 않았다.
|
||||
|
||||
## 해결
|
||||
|
||||
SPEC 은 FRONT-03·04(§6.2), 05(§5 R9), 06~09(§6.1·§7.3), 10·11(§6.1)을 이미
|
||||
옳게 적고 있었다. 구현만 따라가지 않았다. FRONT-01·02 는 SPEC 에도 규칙이
|
||||
없어서 §7.1 에 문장을 넣었다 -- 전역 초기값은 컴파일 시점에 알 수 있어야 한다.
|
||||
|
||||
| ID | fixture |
|
||||
|---|---|
|
||||
| FRONT-01 | `types/badcini.fe` |
|
||||
| FRONT-02 | `types/badsini.fe` |
|
||||
| FRONT-03 | `types/badchain.fe` |
|
||||
| FRONT-04 | `types/badunas.fe` |
|
||||
| FRONT-05 | `types/badasm.fe` |
|
||||
| FRONT-06 | `types/badexns.fe` |
|
||||
| FRONT-07 | `types/badexab.fe` |
|
||||
| FRONT-08 | `types/badexbd.fe` |
|
||||
| FRONT-09 | `types/badfnsm.fe` |
|
||||
| FRONT-10 | `parse/bademen.fe` |
|
||||
| FRONT-11 | `parse/bademer.fe` |
|
||||
| 허용되는 짝 | `types/okglobin.fe` |
|
||||
| `0b`/`0o` | `exec/radix.fe` |
|
||||
|
||||
`-x as T` 와 비교 체이닝을 구별하려면 괄호가 트리에 남아야 해서 노드에
|
||||
`FE_NODE_PAREN` 을 두었다. 파싱 뒤에는 `-x as T` 와 `-(x as T)` 가 같은
|
||||
트리다.
|
||||
|
||||
남은 것: `parse/` fixture 가 트리 내용을 비교하지 않는다는 지적은 그대로
|
||||
유효하다. 우선순위는 지금 `exec/bitnot.fe` 처럼 실행 결과로 구별한다.
|
||||
|
||||
## 이미 알려진 실행 문제
|
||||
|
||||
`0b`와 `0o` 리터럴은 lexer가 받지만 값 계산이 진법을 반영하지 않는다. 실행 결과를
|
||||
|
||||
Reference in New Issue
Block a user