feat(faz2): sembol tablosu — isim çözümleme + scope + referans toplama (#71)

- parser: parseFunctionDecl() parametreleri artık AST'ye alıyor
  (FunctionDeclNode::params alanı eklendi; declarations.hpp/cpp güncellendi)
- parser: parseDeclaration() kullanıcı-tanımlı tip (struct alanı) desteği
- ast_json: addArray() m_hasArrayItem sıfırlama hatası düzeltildi
  (birden fazla dizi alanı içeren düğümlerde bozuk JSON üretimi giderildi)
- src/symbol/: Symbol, Scope, SymbolTable, SymbolCollector eklendi
  * İki geçiş: pass1 global hoist, pass2 gövde + declare-before-use
  * E001 tanımsız isim, E002 çift tanım, E010 döngüsel struct
  * print builtin tohumlama (TODO: #89 katalog)
- cli/symbols: yeni SymbolTable/Collector kullanıyor; tip + refs çıktısı
- examples/symbols/: dup.sqt, undef.sqt, cyclic.sqt test fixture'ları

Doğrulama:
  build/saqut symbols file:examples/fibonacci.sqt → 0 hata, 10 sembol
  examples/symbols/dup.sqt → E002
  examples/symbols/undef.sqt → E001
  examples/symbols/cyclic.sqt → E010
  tests/run.sh → TUM TESTLER GECTI
  AST JSON → geçerli

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
saqut 2026-06-18 15:43:26 +03:00
parent f4f57dd435
commit 218d54ba61
18 changed files with 968 additions and 77 deletions

Binary file not shown.

View File

@ -1,60 +1,17 @@
# ninja log v7
0 1451 1779867877701788943 CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o da6f5fc90e87e6b1
0 1246 1779867877703024703 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6
1451 2772 1779867879152793461 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc
1246 2891 1779867878947792823 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32
5 2061 1779867877706788958 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a
1 2213 1779867877703621428 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80
1 2296 1779867877703518257 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab
1 2529 1779867877703709398 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281
7 2335 1779867877708788964 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c
0 2098 1779867877703316205 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2
0 2499 1779867877703412857 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685
0 2892 1779867877703230815 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23
2892 2983 1779867880593797950 saqut 89052e51305cb697
0 22 1779868368456818650 build.ninja 1876a59d627a585
0 22 1779868368456217236 /home/saqut/Masaüstü/saqutcompiler/build/cmake_install.cmake 1876a59d627a585
1 1528 1779868368464217284 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6
1 1768 1779868368465401047 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a
1 2006 1779868368464927313 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2
1 2109 1779868368465099051 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab
1 2216 1779868368465200112 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80
4 2421 1779868368467294710 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c
1 2425 1779868368465010538 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685
1 2450 1779868368465293953 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281
4 2468 1779868368468417782 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32
1528 2575 1779868369991226412 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc
1 2887 1779868368464815959 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23
2887 2980 1779868371350234528 saqut 89052e51305cb697
2 1845 1781360349526488567 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc
2 1991 1781360349525864955 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32
1 2031 1781360349525052844 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2
1 2080 1781360349525452259 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281
1 2083 1781360349525558767 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a
1 2090 1781360349525147077 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685
2 2155 1781360349525690109 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c
1 2240 1781360349525339814 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80
1 2355 1781360349525238105 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab
1 2750 1781360349524108829 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23
2750 2867 1781360352273116183 saqut 89052e51305cb697
1 1640 1781361120993563298 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281
1 1661 1781361120993456534 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80
2 1669 1781361120993689645 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a
1 1681 1781361120993213226 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685
1 1686 1781361120993117012 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2
3 1712 1781361120994511341 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c
1 1723 1781361120993344591 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab
1 2281 1781361120992511333 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23
2281 2374 1781361123272520466 saqut 89052e51305cb697
2 1202 1781361145332901008 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c
2 1435 1781361145332608544 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281
1 1472 1781361145332432199 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab
2 1506 1781361145332792284 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a
1 1544 1781361145332547154 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80
1 1549 1781361145331608540 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2
1 1569 1781361145332294897 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685
1569 1661 1781361146899614781 saqut 89052e51305cb697
1 1470 1781361261444064707 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23
1471 1563 1781361262914070415 saqut 89052e51305cb697
0 1462 1781361334065345164 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23
1462 1555 1781361335527350781 saqut 89052e51305cb697
1 2432 1781560000479022647 CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o da6f5fc90e87e6b1
1 1218 1781560000479623743 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6
2433 3980 1781560002911027568 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc
1 1408 1781786522326465778 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32
1 2454 1781786563274205322 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a
1 2570 1781786563274005192 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80
1 2619 1781786563273914998 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab
1 2552 1781786563274095617 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281
1 2664 1781786563274315492 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c
1 2656 1781786563273513379 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2
1 2517 1781786563273824541 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685
1 2736 1781786295699197219 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23
2664 2825 1781786565936516467 saqut 8525928b86934b0a
0 22 1781786586571540360 build.ninja 1876a59d627a585
0 22 1781786586571540360 /home/saqut/Masaüstü/saqutcompiler/build/cmake_install.cmake 1876a59d627a585
1 2086 1781786305407208932 CMakeFiles/saqut.dir/src/symbol/symbol_collector.cpp.o 3348f498f369213d

View File

@ -25,7 +25,7 @@ CMAKE_AR:FILEPATH=/usr/bin/ar
CMAKE_BUILD_TYPE:STRING=Debug
//CXX compiler
CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++
CMAKE_CXX_COMPILER:STRING=/usr/bin/c++
//A wrapper around 'ar' adding the appropriate '--plugin' option
// for the GCC compiler
@ -235,7 +235,7 @@ CMAKE_CACHE_MAJOR_VERSION:INTERNAL=4
//Minor version of cmake used to create the current loaded cache
CMAKE_CACHE_MINOR_VERSION:INTERNAL=3
//Patch version of cmake used to create the current loaded cache
CMAKE_CACHE_PATCH_VERSION:INTERNAL=2
CMAKE_CACHE_PATCH_VERSION:INTERNAL=3
//Path to CMake executable.
CMAKE_COMMAND:INTERNAL=/usr/bin/cmake
//Path to cpack program executable.

View File

@ -1187,3 +1187,308 @@ events:
Running the CXX compiler's linker: "/usr/bin/ld" "-v"
GNU ld (GNU Binutils) 2.46.0
...
---
events:
-
kind: "message-v1"
backtrace:
- "/usr/share/cmake/Modules/CMakeDetermineSystem.cmake:212 (message)"
- "CMakeLists.txt:2 (project)"
message: |
The system is: Linux - 7.0.10-1-MANJARO - x86_64
-
kind: "find-v1"
backtrace:
- "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:468 (find_file)"
- "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:506 (CMAKE_DETERMINE_COMPILER_ID_WRITE)"
- "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:8 (CMAKE_DETERMINE_COMPILER_ID_BUILD)"
- "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)"
- "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:125 (CMAKE_DETERMINE_COMPILER_ID)"
- "CMakeLists.txt:2 (project)"
mode: "file"
variable: "src_in"
description: "Path to a file."
settings:
SearchFramework: "NEVER"
SearchAppBundle: "NEVER"
CMAKE_FIND_USE_CMAKE_PATH: true
CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true
CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true
CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true
CMAKE_FIND_USE_INSTALL_PREFIX: true
names:
- "CMakeCXXCompilerId.cpp.in"
candidate_directories:
- "/usr/share/cmake/Modules/"
found: "/usr/share/cmake/Modules/CMakeCXXCompilerId.cpp.in"
search_context:
ENV{PATH}:
- "/home/saqut/.local/bin"
- "/home/saqut/.local/bin"
- "/home/saqut/.local/bin"
- "/usr/local/bin"
- "/usr/bin"
- "/bin"
- "/usr/local/sbin"
- "/opt/cuda/bin"
- "/var/lib/flatpak/exports/bin"
- "/usr/lib/jvm/default/bin"
- "/usr/bin/site_perl"
- "/usr/bin/vendor_perl"
- "/usr/bin/core_perl"
CMAKE_INSTALL_PREFIX: "/usr/local"
-
kind: "message-v1"
backtrace:
- "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)"
- "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)"
- "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:125 (CMAKE_DETERMINE_COMPILER_ID)"
- "CMakeLists.txt:2 (project)"
message: |
Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded.
Compiler: /usr/bin/c++
Build flags:
Id flags:
The output was:
0
Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out"
The CXX compiler identification is GNU, found in:
/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/4.3.3/CompilerIdCXX/a.out
-
kind: "try_compile-v1"
backtrace:
- "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:83 (try_compile)"
- "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)"
- "CMakeLists.txt:2 (project)"
checks:
- "Detecting CXX compiler ABI info"
directories:
source: "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-OqZJyT"
binary: "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-OqZJyT"
cmakeVariables:
CMAKE_CXX_FLAGS: ""
CMAKE_CXX_FLAGS_DEBUG: "-g"
CMAKE_CXX_SCAN_FOR_MODULES: "OFF"
CMAKE_CXX_STDLIB_MODULES_JSON: ""
CMAKE_EXE_LINKER_FLAGS: ""
buildResult:
variable: "CMAKE_CXX_ABI_COMPILED"
cached: true
stdout: |
Change Dir: '/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-OqZJyT'
Run Build Command(s): /usr/bin/ninja -v cmTC_cb4a5
[1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp
Using built-in specs.
COLLECT_GCC=/usr/bin/c++
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 16.1.1 20260430 (GCC)
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/'
/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_cb4a5.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccE5rYpo.s
GNU C++20 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu)
compiled by GNU C version 16.1.1 20260430, GMP version 6.3.0, MPFR version 4.2.2, MPC version 1.4.1, isl version isl-0.27-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../x86_64-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1
/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu
/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward
/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include
/usr/local/include
/usr/include
End of search list.
Compiler executable checksum: d47d0c990a24bc0dbaf3bd00656bd5f3
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/'
as -v --64 -o CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccE5rYpo.s
GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0
COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.'
[2/2] : && /usr/bin/c++ -v -Wl,-v CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_cb4a5 && :
Using built-in specs.
COLLECT_GCC=/usr/bin/c++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 16.1.1 20260430 (GCC)
COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_cb4a5' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_cb4a5.'
/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cc4Zp6V6.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_cb4a5 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o
collect2 version 16.1.1 20260430
/usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cc4Zp6V6.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_cb4a5 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o
GNU ld (GNU Binutils) 2.46.0
COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_cb4a5' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_cb4a5.'
exitCode: 0
-
kind: "message-v1"
backtrace:
- "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:217 (message)"
- "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)"
- "CMakeLists.txt:2 (project)"
message: |
Parsed CXX implicit include dir info: rv=done
found start of include info
found start of implicit include info
add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1]
add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu]
add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward]
add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include]
add: [/usr/local/include]
add: [/usr/include]
end of search list found
collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1] ==> [/usr/include/c++/16.1.1]
collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu] ==> [/usr/include/c++/16.1.1/x86_64-pc-linux-gnu]
collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward] ==> [/usr/include/c++/16.1.1/backward]
collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include]
collapse include dir [/usr/local/include] ==> [/usr/local/include]
collapse include dir [/usr/include] ==> [/usr/include]
implicit include dirs: [/usr/include/c++/16.1.1;/usr/include/c++/16.1.1/x86_64-pc-linux-gnu;/usr/include/c++/16.1.1/backward;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include;/usr/local/include;/usr/include]
-
kind: "message-v1"
backtrace:
- "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:253 (message)"
- "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)"
- "CMakeLists.txt:2 (project)"
message: |
Parsed CXX implicit link information:
link line regex: [^( *|.*[/\\])(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)]
linker tool regex: [^[ ]*(->|"|[0-9]+>[ -]*Build:[ 0-9]+ ms[ ]*)?[ ]*(([^"]*[/\\])?(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)))("|,| |$)]
ignore line: [Change Dir: '/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-OqZJyT']
ignore line: []
ignore line: [Run Build Command(s): /usr/bin/ninja -v cmTC_cb4a5]
ignore line: [[1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp]
ignore line: [Using built-in specs.]
ignore line: [COLLECT_GCC=/usr/bin/c++]
ignore line: [Target: x86_64-pc-linux-gnu]
ignore line: [Configured with: /build/gcc/src/gcc/configure --enable-languages=ada c c++ d fortran go lto m2 objc obj-c++ rust cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes]
ignore line: [Thread model: posix]
ignore line: [Supported LTO compression algorithms: zlib zstd]
ignore line: [gcc version 16.1.1 20260430 (GCC) ]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/']
ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_cb4a5.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccE5rYpo.s]
ignore line: [GNU C++20 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu)]
ignore line: [ compiled by GNU C version 16.1.1 20260430 GMP version 6.3.0 MPFR version 4.2.2 MPC version 1.4.1 isl version isl-0.27-GMP]
ignore line: []
ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072]
ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include-fixed"]
ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../x86_64-pc-linux-gnu/include"]
ignore line: [#include "..." search starts here:]
ignore line: [#include <...> search starts here:]
ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1]
ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu]
ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward]
ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include]
ignore line: [ /usr/local/include]
ignore line: [ /usr/include]
ignore line: [End of search list.]
ignore line: [Compiler executable checksum: d47d0c990a24bc0dbaf3bd00656bd5f3]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/']
ignore line: [ as -v --64 -o CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccE5rYpo.s]
ignore line: [GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0]
ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/]
ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.']
ignore line: [[2/2] : && /usr/bin/c++ -v -Wl -v CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_cb4a5 && :]
ignore line: [Using built-in specs.]
ignore line: [COLLECT_GCC=/usr/bin/c++]
ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper]
ignore line: [Target: x86_64-pc-linux-gnu]
ignore line: [Configured with: /build/gcc/src/gcc/configure --enable-languages=ada c c++ d fortran go lto m2 objc obj-c++ rust cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes]
ignore line: [Thread model: posix]
ignore line: [Supported LTO compression algorithms: zlib zstd]
ignore line: [gcc version 16.1.1 20260430 (GCC) ]
ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/]
ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_cb4a5' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_cb4a5.']
link line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cc4Zp6V6.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_cb4a5 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o]
arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2] ==> ignore
arg [-plugin] ==> ignore
arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so] ==> ignore
arg [-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] ==> ignore
arg [-plugin-opt=-fresolution=/tmp/cc4Zp6V6.res] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc] ==> ignore
arg [-plugin-opt=-pass-through=-latomic_asneeded] ==> ignore
arg [-plugin-opt=-pass-through=-lc] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc] ==> ignore
arg [--build-id] ==> ignore
arg [--eh-frame-hdr] ==> ignore
arg [--hash-style=gnu] ==> ignore
arg [-m] ==> ignore
arg [elf_x86_64] ==> ignore
arg [-dynamic-linker] ==> ignore
arg [/lib64/ld-linux-x86-64.so.2] ==> ignore
arg [-pie] ==> ignore
arg [-o] ==> ignore
arg [cmTC_cb4a5] ==> ignore
arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o]
arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o]
arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o]
arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1]
arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib]
arg [-L/lib/../lib] ==> dir [/lib/../lib]
arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib]
arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..]
arg [-L/lib] ==> dir [/lib]
arg [-L/usr/lib] ==> dir [/usr/lib]
arg [-v] ==> ignore
arg [CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore
arg [-lstdc++] ==> lib [stdc++]
arg [-lm] ==> lib [m]
arg [-lgcc_s] ==> lib [gcc_s]
arg [-lgcc] ==> lib [gcc]
arg [-latomic_asneeded] ==> lib [atomic_asneeded]
arg [-lc] ==> lib [c]
arg [-lgcc_s] ==> lib [gcc_s]
arg [-lgcc] ==> lib [gcc]
arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o]
arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o]
ignore line: [collect2 version 16.1.1 20260430]
ignore line: [/usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cc4Zp6V6.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_cb4a5 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o]
linker tool for 'CXX': /usr/bin/ld
collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> [/usr/lib/Scrt1.o]
collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> [/usr/lib/crti.o]
collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> [/usr/lib/crtn.o]
collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1]
collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] ==> [/usr/lib]
collapse library dir [/lib/../lib] ==> [/lib]
collapse library dir [/usr/lib/../lib] ==> [/usr/lib]
collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] ==> [/usr/lib]
collapse library dir [/lib] ==> [/lib]
collapse library dir [/usr/lib] ==> [/usr/lib]
implicit libs: [stdc++;m;gcc_s;gcc;atomic_asneeded;c;gcc_s;gcc]
implicit objs: [/usr/lib/Scrt1.o;/usr/lib/crti.o;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o;/usr/lib/crtn.o]
implicit dirs: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1;/usr/lib;/lib]
implicit fwks: []
-
kind: "message-v1"
backtrace:
- "/usr/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:38 (message)"
- "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:299 (cmake_determine_linker_id)"
- "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)"
- "CMakeLists.txt:2 (project)"
message: |
Running the CXX compiler's linker: "/usr/bin/ld" "-v"
GNU ld (GNU Binutils) 2.46.0
...

View File

@ -148,6 +148,15 @@ build CMakeFiles/saqut.dir/src/parser/parser.cpp.o: CXX_COMPILER__saqut_unscanne
OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser
TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir
build CMakeFiles/saqut.dir/src/symbol/symbol_collector.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/symbol/symbol_collector.cpp || cmake_object_order_depends_target_saqut
CONFIG = Debug
DEP_FILE = CMakeFiles/saqut.dir/src/symbol/symbol_collector.cpp.o.d
FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0
INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src
OBJECT_DIR = CMakeFiles/saqut.dir
OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/symbol
TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir
build CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/tokenizer/tokenizer.cpp || cmake_object_order_depends_target_saqut
CONFIG = Debug
DEP_FILE = CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o.d
@ -165,7 +174,7 @@ build CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o: CXX_COMPILER__saqut_un
#############################################
# Link the executable saqut
build saqut: CXX_EXECUTABLE_LINKER__saqut_Debug CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o CMakeFiles/saqut.dir/src/main.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o CMakeFiles/saqut.dir/src/parser/parser.cpp.o CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o
build saqut: CXX_EXECUTABLE_LINKER__saqut_Debug CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o CMakeFiles/saqut.dir/src/main.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o CMakeFiles/saqut.dir/src/parser/parser.cpp.o CMakeFiles/saqut.dir/src/symbol/symbol_collector.cpp.o CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o
CONFIG = Debug
DEP_FILE = CMakeFiles/saqut.dir/link.d
FLAGS = -g
@ -221,14 +230,14 @@ build all: phony saqut
#############################################
# Re-run CMake if any of its inputs changed.
build build.ninja /home/saqut/Masaüstü/saqutcompiler/build/cmake_install.cmake: RERUN_CMAKE | /home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt /usr/share/cmake/Modules/CMakeCXXInformation.cmake /usr/share/cmake/Modules/CMakeCommonLanguageInclude.cmake /usr/share/cmake/Modules/CMakeGenericSystem.cmake /usr/share/cmake/Modules/CMakeInitializeConfigs.cmake /usr/share/cmake/Modules/CMakeLanguageInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake /usr/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake /usr/share/cmake/Modules/Compiler/GNU-CXX.cmake /usr/share/cmake/Modules/Compiler/GNU.cmake /usr/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake /usr/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake /usr/share/cmake/Modules/Linker/GNU-CXX.cmake /usr/share/cmake/Modules/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-Initialize.cmake /usr/share/cmake/Modules/Platform/Linux.cmake /usr/share/cmake/Modules/Platform/UnixPaths.cmake CMakeCache.txt CMakeFiles/4.3.2/CMakeCXXCompiler.cmake CMakeFiles/4.3.2/CMakeSystem.cmake
build build.ninja /home/saqut/Masaüstü/saqutcompiler/build/cmake_install.cmake: RERUN_CMAKE | /home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt /usr/share/cmake/Modules/CMakeCXXInformation.cmake /usr/share/cmake/Modules/CMakeCommonLanguageInclude.cmake /usr/share/cmake/Modules/CMakeGenericSystem.cmake /usr/share/cmake/Modules/CMakeInitializeConfigs.cmake /usr/share/cmake/Modules/CMakeLanguageInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake /usr/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake /usr/share/cmake/Modules/Compiler/GNU-CXX.cmake /usr/share/cmake/Modules/Compiler/GNU.cmake /usr/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake /usr/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake /usr/share/cmake/Modules/Linker/GNU-CXX.cmake /usr/share/cmake/Modules/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-Initialize.cmake /usr/share/cmake/Modules/Platform/Linux.cmake /usr/share/cmake/Modules/Platform/UnixPaths.cmake CMakeCache.txt CMakeFiles/4.3.3/CMakeCXXCompiler.cmake CMakeFiles/4.3.3/CMakeSystem.cmake
pool = console
#############################################
# A missing CMake input file is not an error.
build /home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt /usr/share/cmake/Modules/CMakeCXXInformation.cmake /usr/share/cmake/Modules/CMakeCommonLanguageInclude.cmake /usr/share/cmake/Modules/CMakeGenericSystem.cmake /usr/share/cmake/Modules/CMakeInitializeConfigs.cmake /usr/share/cmake/Modules/CMakeLanguageInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake /usr/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake /usr/share/cmake/Modules/Compiler/GNU-CXX.cmake /usr/share/cmake/Modules/Compiler/GNU.cmake /usr/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake /usr/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake /usr/share/cmake/Modules/Linker/GNU-CXX.cmake /usr/share/cmake/Modules/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-Initialize.cmake /usr/share/cmake/Modules/Platform/Linux.cmake /usr/share/cmake/Modules/Platform/UnixPaths.cmake CMakeCache.txt CMakeFiles/4.3.2/CMakeCXXCompiler.cmake CMakeFiles/4.3.2/CMakeSystem.cmake: phony
build /home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt /usr/share/cmake/Modules/CMakeCXXInformation.cmake /usr/share/cmake/Modules/CMakeCommonLanguageInclude.cmake /usr/share/cmake/Modules/CMakeGenericSystem.cmake /usr/share/cmake/Modules/CMakeInitializeConfigs.cmake /usr/share/cmake/Modules/CMakeLanguageInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake /usr/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake /usr/share/cmake/Modules/Compiler/GNU-CXX.cmake /usr/share/cmake/Modules/Compiler/GNU.cmake /usr/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake /usr/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake /usr/share/cmake/Modules/Linker/GNU-CXX.cmake /usr/share/cmake/Modules/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-Initialize.cmake /usr/share/cmake/Modules/Platform/Linux.cmake /usr/share/cmake/Modules/Platform/UnixPaths.cmake CMakeCache.txt CMakeFiles/4.3.3/CMakeCXXCompiler.cmake CMakeFiles/4.3.3/CMakeSystem.cmake: phony
#############################################

View File

@ -0,0 +1,12 @@
// E010 — döngüsel struct (by-value çevrim → sonsuz boyut)
struct A {
B b;
}
struct B {
A a;
}
int main() {
return 0;
}

6
examples/symbols/dup.sqt Normal file
View File

@ -0,0 +1,6 @@
// E002 — aynı scope'ta çift tanım
int main() {
int x = 1;
int x = 2;
return 0;
}

View File

@ -0,0 +1,5 @@
// E001 — tanımsız isim
int main() {
int x = y + 1;
return 0;
}

View File

@ -1,5 +1,5 @@
// ============================================================================
// saQut CLI — symbols komutu (sembol tablosu)
// saQut CLI — symbols komutu (sembol tablosu — Faz 2)
// ============================================================================
#ifndef SAQUT_CLI_SYMBOLS
@ -9,7 +9,9 @@
#include "cli/args.hpp"
#include "tokenizer/tokenizer.hpp"
#include "parser/parser.hpp"
#include "json.hpp"
#include "symbol/symbol_table.hpp"
#include "symbol/symbol_collector.hpp"
#include "diagnostic/diagnostic_engine.hpp"
inline int cmdSymbols(const CliArgs& args) {
std::string source = readSource(args);
@ -27,7 +29,11 @@ inline int cmdSymbols(const CliArgs& args) {
return 1;
}
auto symbols = collectSymbols(ast);
SymbolTable table;
DiagnosticEngine diag;
SymbolCollector(table, diag).collect(ast);
auto symbols = table.allSymbols();
std::cout << "Sembol Tablosu (" << symbols.size() << " sembol):\n";
std::cout << "────────────────────────────────────────────\n";
@ -36,23 +42,27 @@ inline int cmdSymbols(const CliArgs& args) {
std::cout << " (sembol bulunamadı)\n";
}
for (auto& s : symbols) {
std::cout << " [" << s.kind << "] " << s.type << " " << s.name << "\n";
for (Symbol* s : symbols) {
if (s->isBuiltin) continue; // builtinleri çıktıda gösterme
std::cout << " [" << symbolKindName(s->kind) << "] "
<< s->type.toString() << " " << s->name
<< " @" << s->definitionLoc.shortString()
<< " refs(" << s->references.size() << "):";
for (auto& r : s->references)
std::cout << " " << r.shortString();
std::cout << "\n";
}
std::cout << "────────────────────────────────────────────\n";
int fnCount = 0, varCount = 0;
for (auto& s : symbols) {
if (s.kind == "function") fnCount++;
else if (s.kind == "variable") varCount++;
if (diag.hasErrors()) {
std::cerr << "\n";
diag.printAll(std::cerr);
}
std::cout << "Fonksiyon: " << fnCount
<< " | Değişken: " << varCount << "\n";
delete ast;
for (auto* t : tokens) delete t;
return 0;
return diag.hasErrors() ? 1 : 0;
}
#endif // SAQUT_CLI_SYMBOLS

View File

@ -187,7 +187,10 @@ public:
if (m_hasFields) m_ss << ",\n";
m_ss << m_indentInner << "\"" << jsonEscape(key) << "\": [";
m_arrayDepth++;
bool saved = m_hasArrayItem;
m_hasArrayItem = false; // her dizi kendi virgül sayacıyla başlar
callback();
m_hasArrayItem = saved;
m_arrayDepth--;
m_ss << "\n" << m_indentInner << "]";
m_hasFields = true;

View File

@ -12,6 +12,9 @@ std::string FunctionDeclNode::toJson(int depth) {
obj.add("kind", "FunctionDecl");
obj.add("name", name);
obj.add("returnType", returnType);
obj.addArray("params", [&]() {
for (auto* p : params) obj.addItem(p->toJson(depth + 2));
});
obj.addArray("children", [&]() {
for (auto* child : children) obj.addItem(child->toJson(depth + 2));
});

View File

@ -3,10 +3,13 @@
#include "parser/ast_node.hpp"
class VariableDeclNode; // fwd — FunctionDeclNode::params için
class FunctionDeclNode : public ASTNode {
public:
std::string name;
std::string returnType;
std::vector<VariableDeclNode*> params; // TODO(faz2): parametreler
FunctionDeclNode();
void log(int indent = 0) override;
std::string toJson(int depth = 0) override;

View File

@ -91,6 +91,16 @@ ASTNode* Parser::parseDeclaration() {
if (ct.type == TokenType::KW_STRUCT)
return parseStructDecl();
// Kullanıcı tanımlı tip adı (struct tipi) ile değişken/fonksiyon bildirimi
if (ct.type == TokenType::IDENTIFIER) {
auto la1 = lookahead(1);
auto la2 = lookahead(2);
if (la1.type == TokenType::IDENTIFIER && la2.type == TokenType::LPAREN)
return parseFunctionDecl();
if (la1.type == TokenType::IDENTIFIER)
return parseVariableDecl();
}
return parseStatement();
}
@ -293,8 +303,26 @@ ASTNode* Parser::parseFunctionDecl() {
if (currentToken().type == TokenType::LPAREN) {
nextToken();
while (currentToken().type != TokenType::RPAREN &&
currentToken().type != TokenType::SVR_VOID)
currentToken().type != TokenType::SVR_VOID) {
auto typeTok = currentToken();
bool isTypeKw = typeTok.is({
TokenType::KW_VOID, TokenType::KW_INT, TokenType::KW_FLOAT_TYPE,
TokenType::KW_DOUBLE, TokenType::KW_BOOL, TokenType::KW_CHAR,
TokenType::KW_STRING_TYPE, TokenType::KW_AUTO
}) || typeTok.type == TokenType::IDENTIFIER;
if (!isTypeKw || !typeTok.token) break;
std::string paramType = typeTok.token->token;
nextToken();
if (currentToken().type != TokenType::IDENTIFIER || !currentToken().token) break;
VariableDeclNode* param = new VariableDeclNode();
param->loc = currentToken().token->loc;
param->varType = paramType;
param->name = currentToken().token->token;
nextToken();
fn->params.push_back(param);
if (currentToken().type == TokenType::COMMA)
nextToken();
}
if (currentToken().type == TokenType::RPAREN)
nextToken();
}

37
src/symbol/scope.hpp Normal file
View File

@ -0,0 +1,37 @@
#ifndef SAQUT_SYMBOL_SCOPE
#define SAQUT_SYMBOL_SCOPE
#include <unordered_map>
#include <vector>
#include "symbol/symbol.hpp"
class Scope {
public:
Scope* parent = nullptr;
explicit Scope(Scope* p = nullptr) : parent(p) {}
// Bu scope'a ekle. Aynı adda varsa nullptr (duplicate → çağıran E002 verir).
Symbol* defineLocal(Symbol* s) {
if (table.count(s->name)) return nullptr;
table[s->name] = s;
order.push_back(s);
s->scope = this;
return s;
}
Symbol* lookupLocal(const std::string& n) {
auto it = table.find(n);
return it == table.end() ? nullptr : it->second;
}
Symbol* resolve(const std::string& n) {
for (Scope* s = this; s; s = s->parent)
if (auto* r = s->lookupLocal(n)) return r;
return nullptr;
}
std::unordered_map<std::string, Symbol*> table; // non-owning
std::vector<Symbol*> order; // ekleme sırası
};
#endif // SAQUT_SYMBOL_SCOPE

34
src/symbol/symbol.hpp Normal file
View File

@ -0,0 +1,34 @@
#ifndef SAQUT_SYMBOL_SYMBOL
#define SAQUT_SYMBOL_SYMBOL
#include <string>
#include <vector>
#include "core/type.hpp"
#include "core/location.hpp"
enum class SymbolKind { Variable, Function, Parameter, Struct, Field };
inline const char* symbolKindName(SymbolKind k) {
switch (k) {
case SymbolKind::Variable: return "variable";
case SymbolKind::Function: return "function";
case SymbolKind::Parameter: return "parameter";
case SymbolKind::Struct: return "struct";
case SymbolKind::Field: return "field";
}
return "?";
}
class Scope;
struct Symbol {
std::string name;
SymbolKind kind = SymbolKind::Variable;
Type type;
SourceLocation definitionLoc;
std::vector<SourceLocation> references;
Scope* scope = nullptr;
bool isBuiltin = false;
};
#endif // SAQUT_SYMBOL_SYMBOL

View File

@ -0,0 +1,377 @@
#include "symbol/symbol_collector.hpp"
#include <functional>
#include "parser/nodes/program.hpp"
#include "parser/nodes/declarations.hpp"
#include "parser/nodes/statements.hpp"
#include "parser/nodes/expressions.hpp"
#include "parser/nodes/binary_expr.hpp"
#include "parser/nodes/identifier.hpp"
// ─────────────────────────────────────────────────────────────────────────────
// collect — dört aşamalı toplama
// ─────────────────────────────────────────────────────────────────────────────
void SymbolCollector::collect(ASTNode* program) {
if (!program) return;
seedBuiltins();
pass1Globals(program);
checkStructCycles();
pass2Bodies(program);
}
// ─────────────────────────────────────────────────────────────────────────────
// seedBuiltins — global scope'a yerleşik fonksiyonları ekle
// ─────────────────────────────────────────────────────────────────────────────
void SymbolCollector::seedBuiltins() {
// TODO(#89 builtin kataloğu): geçici; ileride gerçek katalog gelecek.
Symbol* s = table_.define("print", SymbolKind::Function,
Type::function(Type::Void(), {}),
SourceLocation{});
if (s) s->isBuiltin = true;
}
// ─────────────────────────────────────────────────────────────────────────────
// typeFromName — tip adından Type üret; bilinmiyorsa E007
// ─────────────────────────────────────────────────────────────────────────────
Type SymbolCollector::typeFromName(const std::string& n, const SourceLocation& loc) {
Type t = Type::fromName(n);
if (!t.isError()) return t;
if (structFields_.count(n)) return Type::structType(n);
// TODO(faz2/faz3): bilinmeyen tip tam E007 tanısı
diag_.report("E007", loc, "Bilinmeyen tip: '" + n + "'");
return Type::error();
}
// ─────────────────────────────────────────────────────────────────────────────
// pass1Globals — üst-seviye isimleri hoist eder (gövdelere girmez)
// ─────────────────────────────────────────────────────────────────────────────
void SymbolCollector::pass1Globals(ASTNode* program) {
for (ASTNode* child : program->getChildren()) {
switch (child->kind) {
case ASTKind::FunctionDecl: {
auto* fn = (FunctionDeclNode*)child;
// parametre tiplerini topla
std::vector<Type> paramTypes;
for (auto* p : fn->params)
paramTypes.push_back(typeFromName(p->varType, p->loc));
Type retType = typeFromName(fn->returnType, fn->loc);
Symbol* s = table_.define(fn->name, SymbolKind::Function,
Type::function(retType, paramTypes),
fn->loc);
if (!s)
diag_.report("E002", fn->loc,
"'" + fn->name + "' zaten bu kapsamda tanımlı");
break;
}
case ASTKind::StructDecl: {
auto* st = (StructDeclNode*)child;
Symbol* s = table_.define(st->name, SymbolKind::Struct,
Type::structType(st->name), st->loc);
if (!s) {
diag_.report("E002", st->loc,
"'" + st->name + "' zaten bu kapsamda tanımlı");
break;
}
// struct alan isimlerini cycle check için kaydet
for (ASTNode* fieldNode : st->getChildren()) {
if (fieldNode->kind == ASTKind::VariableDecl) {
auto* vd = (VariableDeclNode*)fieldNode;
// yalnızca struct tipindeki alanları izle
Type ft = Type::fromName(vd->varType);
if (ft.isError()) // primitif değilse struct tipi olabilir
structFields_[st->name].push_back(vd->varType);
}
}
break;
}
case ASTKind::VariableDecl: {
auto* vd = (VariableDeclNode*)child;
Symbol* s = table_.define(vd->name, SymbolKind::Variable,
typeFromName(vd->varType, vd->loc),
vd->loc);
if (!s)
diag_.report("E002", vd->loc,
"'" + vd->name + "' zaten bu kapsamda tanımlı");
// Sibling VariableDecl'ler (int a, b;)
for (ASTNode* sib : vd->getChildren()) {
if (sib->kind == ASTKind::VariableDecl) {
auto* sv = (VariableDeclNode*)sib;
Symbol* ss = table_.define(sv->name, SymbolKind::Variable,
typeFromName(sv->varType, sv->loc),
sv->loc);
if (!ss)
diag_.report("E002", sv->loc,
"'" + sv->name + "' zaten bu kapsamda tanımlı");
}
}
break;
}
default:
break;
}
}
}
// ─────────────────────────────────────────────────────────────────────────────
// checkStructCycles — E010 döngüsel struct (by-value çevrim → sonsuz boyut)
// ─────────────────────────────────────────────────────────────────────────────
void SymbolCollector::checkStructCycles() {
// white=0 / gray=1 / black=2
std::unordered_map<std::string, int> color;
for (auto& kv : structFields_) color[kv.first] = 0;
std::function<bool(const std::string&)> dfs = [&](const std::string& name) -> bool {
auto it = color.find(name);
if (it == color.end()) return false; // primitif / bilinmeyen → çevrim değil
if (it->second == 1) return true; // gray → back-edge → çevrim!
if (it->second == 2) return false; // black → zaten işlendi
it->second = 1; // gri yap
auto fit = structFields_.find(name);
if (fit != structFields_.end()) {
for (const std::string& dep : fit->second) {
if (dfs(dep)) return true;
}
}
it->second = 2; // siyah yap
return false;
};
for (auto& kv : structFields_) {
if (color[kv.first] == 0) {
// DFS başlat
color[kv.first] = 1;
for (const std::string& dep : kv.second) {
if (dfs(dep)) {
// tanımlama konumunu bulmak için global scope'ta ara
Symbol* s = table_.global()->lookupLocal(kv.first);
SourceLocation loc = s ? s->definitionLoc : SourceLocation{};
diag_.report("E010", loc,
"Döngüsel struct: '" + kv.first + "' by-value sonsuz boyut oluşturur");
break;
}
}
color[kv.first] = 2;
}
}
}
// ─────────────────────────────────────────────────────────────────────────────
// pass2Bodies — fonksiyon gövdelerini gez; isim çözümle + referans topla
// ─────────────────────────────────────────────────────────────────────────────
void SymbolCollector::pass2Bodies(ASTNode* program) {
for (ASTNode* child : program->getChildren()) {
switch (child->kind) {
case ASTKind::FunctionDecl: {
auto* fn = (FunctionDeclNode*)child;
table_.enterScope();
// parametreleri tanımla
for (auto* p : fn->params) {
Symbol* s = table_.define(p->name, SymbolKind::Parameter,
typeFromName(p->varType, p->loc), p->loc);
if (!s)
diag_.report("E002", p->loc,
"Parametre '" + p->name + "' zaten tanımlı");
}
// gövdeyi gez (children[0] = BlockNode)
auto& ch = fn->getChildren();
if (!ch.empty()) walkStmt(ch[0]);
table_.exitScope();
break;
}
case ASTKind::VariableDecl: {
// global değişken başlatıcısı (declare-before-use)
auto* vd = (VariableDeclNode*)child;
if (vd->initExpr) walkExpr(vd->initExpr);
// TODO(faz2): global init sırası kontrolü (fibonacci'de global var yok)
for (ASTNode* sib : vd->getChildren()) {
if (sib->kind == ASTKind::VariableDecl) {
auto* sv = (VariableDeclNode*)sib;
if (sv->initExpr) walkExpr(sv->initExpr);
}
}
break;
}
case ASTKind::StructDecl:
break; // pass2'de gövde gezme gerekmez
default:
break;
}
}
}
// ─────────────────────────────────────────────────────────────────────────────
// walkStmt — ifade bloğunu gez
// ─────────────────────────────────────────────────────────────────────────────
void SymbolCollector::walkStmt(ASTNode* node) {
if (!node) return;
switch (node->kind) {
case ASTKind::Block: {
table_.enterScope();
for (ASTNode* child : node->getChildren()) walkStmt(child);
table_.exitScope();
break;
}
case ASTKind::VariableDecl: {
auto* vd = (VariableDeclNode*)node;
// Önce başlatıcıyı gez (kendini görmesin)
if (vd->initExpr) walkExpr(vd->initExpr);
// Sonra tanımla
Symbol* s = table_.define(vd->name, SymbolKind::Variable,
typeFromName(vd->varType, vd->loc), vd->loc);
if (!s)
diag_.report("E002", vd->loc,
"'" + vd->name + "' zaten bu kapsamda tanımlı");
// Sibling VariableDecl'ler (int a, b;) — TODO: fibonacci'de yok
for (ASTNode* sib : vd->getChildren()) {
if (sib->kind == ASTKind::VariableDecl) {
auto* sv = (VariableDeclNode*)sib;
if (sv->initExpr) walkExpr(sv->initExpr);
Symbol* ss = table_.define(sv->name, SymbolKind::Variable,
typeFromName(sv->varType, sv->loc), sv->loc);
if (!ss)
diag_.report("E002", sv->loc,
"'" + sv->name + "' zaten bu kapsamda tanımlı");
}
}
break;
}
case ASTKind::IfStatement: {
auto* ifn = (IfStatementNode*)node;
if (ifn->condition) walkExpr(ifn->condition);
if (ifn->thenBranch) walkStmt(ifn->thenBranch);
if (ifn->elseBranch) walkStmt(ifn->elseBranch);
break;
}
case ASTKind::WhileStatement: {
auto* ws = (WhileStatementNode*)node;
if (ws->condition) walkExpr(ws->condition);
if (ws->body) walkStmt(ws->body);
break;
}
case ASTKind::ForStatement: {
auto* fs = (ForStatementNode*)node;
table_.enterScope(); // init değişkeni döngüye ait
if (fs->init) {
if (fs->init->kind == ASTKind::VariableDecl) walkStmt(fs->init);
else walkExpr(fs->init);
}
if (fs->condition) walkExpr(fs->condition);
if (fs->update) walkExpr(fs->update);
if (fs->body) walkStmt(fs->body);
table_.exitScope();
break;
}
case ASTKind::DoWhileStatement: {
auto* dw = (DoWhileStatementNode*)node;
if (dw->body) walkStmt(dw->body);
if (dw->condition) walkExpr(dw->condition);
break;
}
case ASTKind::ReturnStatement: {
auto* rs = (ReturnStatementNode*)node;
if (rs->value) walkExpr(rs->value);
break;
}
case ASTKind::ExpressionStatement: {
auto* es = (ExpressionStatementNode*)node;
if (es->expression) walkExpr(es->expression);
break;
}
case ASTKind::BreakStatement:
case ASTKind::ContinueStatement:
break; // yaprak
default:
break;
}
}
// ─────────────────────────────────────────────────────────────────────────────
// walkExpr — ifade ağacında isimleri çöz
// ─────────────────────────────────────────────────────────────────────────────
void SymbolCollector::walkExpr(ASTNode* node) {
if (!node) return;
switch (node->kind) {
case ASTKind::Identifier: {
auto* id = (IdentifierNode*)node;
if (!id->parserToken.token) break;
std::string name = id->parserToken.token->token;
Symbol* s = table_.resolve(name);
if (s) {
id->resolvedSymbol = s;
table_.addReference(s, id->loc);
} else {
diag_.report("E001", id->loc,
"'" + name + "' tanımlı değil");
}
break;
}
case ASTKind::BinaryExpression: {
auto* bin = (BinaryExpressionNode*)node;
if (bin->Left) walkExpr(bin->Left);
if (bin->Right) walkExpr(bin->Right);
break;
}
case ASTKind::Call: {
auto* call = (CallExpressionNode*)node;
if (call->callee) walkExpr(call->callee);
for (ASTNode* arg : call->arguments) walkExpr(arg);
break;
}
case ASTKind::Postfix: {
auto* pf = (PostfixNode*)node;
if (pf->operand) walkExpr(pf->operand);
break;
}
case ASTKind::MemberAccess: {
auto* ma = (MemberAccessNode*)node;
if (ma->object) walkExpr(ma->object); // member çözümü Faz 3 → TODO
break;
}
case ASTKind::IndexExpression: {
auto* ie = (IndexExpressionNode*)node;
if (ie->object) walkExpr(ie->object);
if (ie->index) walkExpr(ie->index);
break;
}
case ASTKind::Literal:
break; // yaprak
default:
break;
}
}

View File

@ -0,0 +1,37 @@
#ifndef SAQUT_SYMBOL_COLLECTOR
#define SAQUT_SYMBOL_COLLECTOR
#include <string>
#include <unordered_map>
#include <vector>
#include "symbol/symbol_table.hpp"
#include "diagnostic/diagnostic_engine.hpp"
#include "core/type.hpp"
#include "core/location.hpp"
#include "parser/ast_node.hpp"
class SymbolCollector {
public:
SymbolCollector(SymbolTable& t, DiagnosticEngine& d) : table_(t), diag_(d) {}
// seedBuiltins → pass1 → structCycles(E010) → pass2
void collect(ASTNode* program);
private:
void seedBuiltins();
void pass1Globals(ASTNode* program);
void checkStructCycles();
void pass2Bodies(ASTNode* program);
void walkStmt(ASTNode* node);
void walkExpr(ASTNode* node);
Type typeFromName(const std::string& n, const SourceLocation& loc);
SymbolTable& table_;
DiagnosticEngine& diag_;
// struct adı → içerdiği struct-tip alan adları (cycle check için)
std::unordered_map<std::string, std::vector<std::string>> structFields_;
};
#endif // SAQUT_SYMBOL_COLLECTOR

View File

@ -0,0 +1,65 @@
#ifndef SAQUT_SYMBOL_TABLE
#define SAQUT_SYMBOL_TABLE
#include <memory>
#include <vector>
#include "symbol/scope.hpp"
class SymbolTable {
public:
SymbolTable() {
global_ = newScope(nullptr);
current_ = global_;
}
Scope* global() { return global_; }
Scope* current() { return current_; }
Scope* enterScope() {
current_ = newScope(current_);
return current_;
}
void exitScope() {
if (current_->parent) current_ = current_->parent;
}
// current scope'ta tanımla; duplicate → nullptr döner
Symbol* define(const std::string& name, SymbolKind k, Type t, SourceLocation loc) {
auto s = std::make_unique<Symbol>();
s->name = name;
s->kind = k;
s->type = std::move(t);
s->definitionLoc = loc;
Symbol* raw = s.get();
if (!current_->defineLocal(raw)) return nullptr; // duplicate
pool_.push_back(std::move(s));
return raw;
}
Symbol* resolve(const std::string& n) { return current_->resolve(n); }
void addReference(Symbol* s, SourceLocation loc) {
if (s) s->references.push_back(loc);
}
std::vector<Symbol*> allSymbols() const {
std::vector<Symbol*> result;
result.reserve(pool_.size());
for (const auto& s : pool_) result.push_back(s.get());
return result;
}
private:
Scope* newScope(Scope* p) {
scopes_.push_back(std::make_unique<Scope>(p));
return scopes_.back().get();
}
std::vector<std::unique_ptr<Scope>> scopes_;
std::vector<std::unique_ptr<Symbol>> pool_;
Scope* global_ = nullptr;
Scope* current_ = nullptr;
};
#endif // SAQUT_SYMBOL_TABLE