diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ade4d46e..bff3943b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,7 @@ on: branches: [ main, dev ] paths-ignore: - "**.md" + workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -34,24 +35,26 @@ jobs: - name: Verify dependencies run: go mod verify - - uses: golangci/golangci-lint-action@v9 + - name: Run golangci-lint + uses: golangci/golangci-lint-action@v9 with: version: latest - args: --timeout=5m build: name: Build and test (${{ matrix.os }}) - needs: lint runs-on: ${{ matrix.os }} timeout-minutes: 10 strategy: fail-fast: false matrix: - os: [ ubuntu-latest, macos-latest, windows-latest ] - - env: - BIN_NAME: ${{ runner.os == 'Windows' && 'azc.exe' || 'azc' }} + include: + - os: ubuntu-latest + bin: azc + - os: macos-latest + bin: azc + - os: windows-latest + bin: azc.exe defaults: run: @@ -66,7 +69,16 @@ jobs: cache: true cache-dependency-path: go.sum - - name: Setup MSVC + - name: Install modern GCC (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update -qq + sudo apt-get install -y -qq software-properties-common + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get install -y -qq gcc-14 + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 100 + + - name: Setup MSVC (Windows) if: runner.os == 'Windows' uses: ilammy/msvc-dev-cmd@v1 @@ -74,16 +86,16 @@ jobs: run: go mod download - name: Build binary - run: go build -v -o "$BIN_NAME" ./cmd/azc + run: go build -v -o "${{ matrix.bin }}" ./cmd/azc - name: Run tests env: - AZC: ${{ github.workspace }}/${{ env.BIN_NAME }} - run: go test -v -race -count=1 -cover ./... + AZC: ${{ github.workspace }}/${{ matrix.bin }} + run: go test -v -count=1 -cover ./... - name: Upload binary artifact uses: actions/upload-artifact@v7 with: - name: azc-${{ runner.os }} - path: ${{ env.BIN_NAME }} - retention-days: 7 \ No newline at end of file + name: azc-${{ matrix.os }} + path: ${{ matrix.bin }} + retention-days: 7 diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 79fb63df..28692170 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -2,9 +2,9 @@ name: Deploy API Docs on: push: - branches: [ dev ] + branches: [ main, dev ] pull_request: - branches: [ dev ] + branches: [ main, dev ] workflow_dispatch: concurrency: diff --git a/.golangci.yml b/.golangci.yml index 67ebcee2..aa134782 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -24,17 +24,13 @@ linters: # Quality - copyloopvar - - exhaustive - gocheckcompilerdirectives - goconst - gocritic - intrange - - iotamixing - makezero - mirror - misspell - - modernize - - nolintlint - prealloc - predeclared - recvcheck diff --git a/internal/codegen/c/analysis/builtins.go b/internal/codegen/c/analysis/builtins.go index d898fe7f..c52982f7 100644 --- a/internal/codegen/c/analysis/builtins.go +++ b/internal/codegen/c/analysis/builtins.go @@ -31,22 +31,22 @@ var Builtins = map[string]Builtin{ "getchar": {Stdio}, "putchar": {Stdio}, - "malloc": {Stdlib}, - "calloc": {Stdlib}, - "realloc": {Stdlib}, - "free": {Stdlib}, - "exit": {Stdlib}, - "abs" : {Stdlib}, - "atoi" : {Stdlib}, - "atof" : {Stdlib}, - "atol" : {Stdlib}, - "atoll" : {Stdlib}, - "strtol": {Stdlib}, - "strtoll": {Stdlib}, - "strtoul": {Stdlib}, - "strtoull":{Stdlib}, - "strtod": {Stdlib}, - "strtof": {Stdlib}, + "malloc": {Stdlib}, + "calloc": {Stdlib}, + "realloc": {Stdlib}, + "free": {Stdlib}, + "exit": {Stdlib}, + "abs": {Stdlib}, + "atoi": {Stdlib}, + "atof": {Stdlib}, + "atol": {Stdlib}, + "atoll": {Stdlib}, + "strtol": {Stdlib}, + "strtoll": {Stdlib}, + "strtoul": {Stdlib}, + "strtoull": {Stdlib}, + "strtod": {Stdlib}, + "strtof": {Stdlib}, "strlen": {String}, "strcpy": {String}, @@ -64,14 +64,13 @@ var Builtins = map[string]Builtin{ "memmove": {String}, "memcmp": {String}, - "sqrt": {Math}, - "pow": {Math}, - "sin": {Math}, - "cos": {Math}, - "floor": {Math}, - "ceil": {Math}, - "fabs": {Math}, - + "sqrt": {Math}, + "pow": {Math}, + "sin": {Math}, + "cos": {Math}, + "floor": {Math}, + "ceil": {Math}, + "fabs": {Math}, } func LookupBuiltin(name string) (Builtin, bool) { diff --git a/internal/codegen/c/analysis/builtins_test.go b/internal/codegen/c/analysis/builtins_test.go index db99cae1..d26e2e7e 100644 --- a/internal/codegen/c/analysis/builtins_test.go +++ b/internal/codegen/c/analysis/builtins_test.go @@ -21,9 +21,9 @@ func TestLookupBuiltin(t *testing.T) { for _, tt := range tests { result, ok := LookupBuiltin(tt.name) - if (result.Include != tt.exceptedValue || ok != tt.exceptedOk) { - t.Errorf("LookupBuiltin(%q) = (%q, %v); want (%q, %v)", - tt.name, result, ok, tt.exceptedValue, tt.exceptedOk) + if result.Include != tt.exceptedValue || ok != tt.exceptedOk { + t.Errorf("LookupBuiltin(%q) = (%q, %v); want (%q, %v)", + tt.name, result, ok, tt.exceptedValue, tt.exceptedOk) } } } diff --git a/internal/codegen/c/analysis/visit_var.go b/internal/codegen/c/analysis/visit_var.go index f36a69f8..d1b29133 100644 --- a/internal/codegen/c/analysis/visit_var.go +++ b/internal/codegen/c/analysis/visit_var.go @@ -4,4 +4,5 @@ import "github.com/azin-lang/Azin/internal/ast" func (a *Analyzer) visitVar(fn string, stmt *ast.VarStmt) { a.registerVariable(fn, stmt.Name.Value) + a.visitExpr(fn, stmt.Value) } diff --git a/internal/optimizer/optimizer.go b/internal/optimizer/optimizer.go index c4759a99..3e40bef5 100644 --- a/internal/optimizer/optimizer.go +++ b/internal/optimizer/optimizer.go @@ -137,12 +137,6 @@ func (s *Scope) Invalidate(name string) { } func (s *Scope) ClearAll() { - // Wipe this scope's known values and stores (e.g. for Loops) s.values = make(map[string]ast.Expr) s.lastStore = make(map[string]ast.Stmt) - - // Recursively wipe parent scopes - if s.parent != nil { - s.parent.ClearAll() - } } diff --git a/internal/sema/analyzer.go b/internal/sema/analyzer.go index 88546819..8313b86b 100644 --- a/internal/sema/analyzer.go +++ b/internal/sema/analyzer.go @@ -42,7 +42,9 @@ func mangleFunctionName(fn *ast.FuncStmt) string { var name strings.Builder name.WriteString(fn.Name.Value) for _, param := range fn.Params { - name.WriteString("__" + param.SynType.Value) + if param.SynType != nil { + name.WriteString("__" + param.SynType.Value) + } } return name.String() @@ -351,6 +353,9 @@ func (a *Analyzer) registerTopLevelSymbols(program *ast.Program) { }) for _, param := range n.Params { + if param.SynType == nil { + continue + } paramType := a.lookupType(param.SynType.Value) if paramType == nil { a.errorf(param.SynType, "unknown parameter type: %s", param.SynType.Value) @@ -635,6 +640,11 @@ func (a *Analyzer) visitStatement(stmt ast.Stmt) { return } + if sym := a.lookup(objectType.Name); sym != nil && sym.Kind == SymbolEnum { + a.errorf(n.Value, "'%s' is an enum and cannot be assigned to", objectType.Name) + return + } + strct := a.lookupStruct(objectType.Name) if strct == nil { a.errorf(n.Value, "'%s' is not a struct", objectType.Name) diff --git a/internal/source/file.go b/internal/source/file.go index e031a472..5f2ab0ef 100644 --- a/internal/source/file.go +++ b/internal/source/file.go @@ -23,7 +23,7 @@ func New(name string, text []byte) *File { for i, ch := range text { if ch == '\n' { - lines = append(lines, uint32(i+1)) + lines = append(lines, uint32(i+1)) //nolint:gosec } }