zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 3debd6b732556832e58491cb153e1fee2cc8876b (tree)
parent 943f4eb515ec03499cf7b37d80b964e15502bfc8
Author: zooster <r00ster91@proton.me>
Date:   Sat,  6 Aug 2022 19:32:42 +0200

Merge branch 'master' into nicedocs
Diffstat:
Mci/srht/update_download_page | 17++++++++++-------
Mlib/docs/index.html | 1+
Mlib/docs/main.js | 57++++++++++++++++++++++++++++++++++++++-------------------
Msrc/Sema.zig | 36++++++++++++++++++++++++++++++------
Atest/cases/compile_errors/AstGen_comptime_known_struct_is_resolved_before_error.zig | 19+++++++++++++++++++
Atest/cases/compile_errors/self_referential_struct_requires_comptime.zig | 18++++++++++++++++++
Atest/cases/compile_errors/self_referential_union_requires_comptime.zig | 17+++++++++++++++++
7 files changed, 133 insertions(+), 32 deletions(-)

diff --git a/ci/srht/update_download_page b/ci/srht/update_download_page @@ -100,6 +100,15 @@ cd "$SRCTARBALLDIR/ci/srht" CIDIR="$(pwd)" cd "$HOME" + +# Upload new stdlib autodocs +mkdir -p docs_to_upload/documentation/master/std/ +cp "$ZIGDIR/docs/std/index.html" docs_to_upload/documentation/master/std/index.html +cp "$ZIGDIR/docs/std/data.js" docs_to_upload/documentation/master/std/data.js +cp "$ZIGDIR/docs/std/main.js" docs_to_upload/documentation/master/std/main.js +cp "$LANGREF" docs_to_upload/documentation/master/index.html +$S3CMD put -P --no-mime-magic --recursive --add-header="Cache-Control: max-age=0, must-revalidate" "docs_to_upload/" s3://ziglang.org/ + git clone --depth 1 git@github.com:ziglang/www.ziglang.org.git cd www.ziglang.org WWWDIR="$(pwd)" @@ -108,12 +117,6 @@ $S3CMD put -P --no-mime-magic --add-header="cache-control: public, max-age=31536 cd "$WWWDIR" cp "$CIDIR/out/index.json" data/releases.json -mkdir -p content/documentation/master/std -cp "$LANGREF" content/documentation/master/index.html -cp "$ZIGDIR/docs/std/index.html" content/documentation/master/std/index.html -cp "$ZIGDIR/docs/std/data.js" content/documentation/master/std/data.js -cp "$ZIGDIR/docs/std/main.js" content/documentation/master/std/main.js git add data/releases.json -git add content/ -git commit -m "CI: update releases and docs" +git commit -m "CI: update releases" git push origin master diff --git a/lib/docs/index.html b/lib/docs/index.html @@ -650,6 +650,7 @@ <div id="sectSearchResults" class="hidden"> <h2>Search Results</h2> <ul id="listSearchResults"></ul> + <p id="sectSearchAllResultsLink" class="hidden"><a href="">show all results</a></p> </div> <div id="sectSearchNoResults" class="hidden"> <h2>No Results Found</h2> diff --git a/lib/docs/main.js b/lib/docs/main.js @@ -40,6 +40,7 @@ var zigAnalysis; const domDeclNoRef = document.getElementById("declNoRef"); const domSearch = document.getElementById("search"); const domSectSearchResults = document.getElementById("sectSearchResults"); + const domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink"); const domListSearchResults = document.getElementById("listSearchResults"); const domSectSearchNoResults = document.getElementById("sectSearchNoResults"); @@ -51,9 +52,8 @@ var zigAnalysis; const domHelpModal = document.getElementById("helpModal"); const domSearchPlaceholder = document.getElementById("searchPlaceholder"); - domSearch.disabled = false; - let searchTimer = null; + let searchTrimResults = true; let escapeHtmlReplacements = { "&": "&amp;", @@ -105,6 +105,7 @@ var zigAnalysis; // map of decl index to list of comptime fn calls // let nodesToCallsMap = indexNodesToCalls(); + domSearch.disabled = false; domSearch.addEventListener("keydown", onSearchKeyDown, false); domSearch.addEventListener("focus", ev => { domSearchPlaceholder.classList.add("hidden"); @@ -113,6 +114,14 @@ var zigAnalysis; if (domSearch.value.length == 0) domSearchPlaceholder.classList.remove("hidden"); }); + domSectSearchAllResultsLink.addEventListener('click', onClickSearchShowAllResults, false); + function onClickSearchShowAllResults(ev) { + ev.preventDefault(); + ev.stopPropagation(); + searchTrimResults = false; + onHashChange(); + } + domPrivDeclsBox.addEventListener( "change", function () { @@ -371,6 +380,7 @@ var zigAnalysis; domSectFns.classList.add("hidden"); domSectFields.classList.add("hidden"); domSectSearchResults.classList.add("hidden"); + domSectSearchAllResultsLink.classList.add("hidden"); domSectSearchNoResults.classList.add("hidden"); domSectInfo.classList.add("hidden"); domHdrName.classList.add("hidden"); @@ -3273,14 +3283,14 @@ var zigAnalysis; let oldHash = location.hash; let parts = oldHash.split("?"); let newPart2 = domSearch.value === "" ? "" : "?" + domSearch.value; - location.hash = - parts.length === 1 ? oldHash + newPart2 : parts[0] + newPart2; + location.replace(parts.length === 1 ? oldHash + newPart2 : parts[0] + newPart2); } function getSearchTerms() { let list = curNavSearch.trim().split(/[ \r\n\t]+/); list.sort(); return list; } + function renderSearch() { let matchedItems = []; let ignoreCase = curNavSearch.toLowerCase() === curNavSearch; @@ -3346,28 +3356,37 @@ var zigAnalysis; } if (matchedItems.length !== 0) { - resizeDomList( - domListSearchResults, - matchedItems.length, - '<li><a href="#"></a></li>' - ); - matchedItems.sort(function (a, b) { let cmp = operatorCompare(b.points, a.points); if (cmp != 0) return cmp; return operatorCompare(a.decl.name, b.decl.name); }); + + var searchTrimmed = false + var searchTrimResultsMaxItems = 200 + if (searchTrimResults && matchedItems.length > searchTrimResultsMaxItems) { + matchedItems = matchedItems.slice(0, searchTrimResultsMaxItems) + searchTrimmed = true + } + + // Build up the list of search results + let matchedItemsHTML = ""; + for (let i = 0; i < matchedItems.length; i += 1) { - let liDom = domListSearchResults.children[i]; - let aDom = liDom.children[0]; - let match = matchedItems[i]; - let lastPkgName = match.path.pkgNames[match.path.pkgNames.length - 1]; - aDom.textContent = lastPkgName + "." + match.path.declNames.join("."); - aDom.setAttribute( - "href", - navLink(match.path.pkgNames, match.path.declNames) - ); + const match = matchedItems[i]; + const lastPkgName = match.path.pkgNames[match.path.pkgNames.length - 1]; + + const text = lastPkgName + "." + match.path.declNames.join("."); + const href = navLink(match.path.pkgNames, match.path.declNames); + + matchedItemsHTML += "<li><a href=\""+ href +"\">"+ text + "</a></li>"; + } + + // Replace the search results using our newly constructed HTML string + domListSearchResults.innerHTML = matchedItemsHTML; + if (searchTrimmed) { + domSectSearchAllResultsLink.classList.remove("hidden"); } renderSearchCursor(); diff --git a/src/Sema.zig b/src/Sema.zig @@ -19764,6 +19764,8 @@ fn validateRunTimeType( }; } +const TypeSet = std.HashMapUnmanaged(Type, void, Type.HashContext64, std.hash_map.default_max_load_percentage); + fn explainWhyTypeIsComptime( sema: *Sema, block: *Block, @@ -19772,6 +19774,22 @@ fn explainWhyTypeIsComptime( src_loc: Module.SrcLoc, ty: Type, ) CompileError!void { + var type_set = TypeSet{}; + defer type_set.deinit(sema.gpa); + + try sema.resolveTypeFully(block, src, ty); + return sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty, &type_set); +} + +fn explainWhyTypeIsComptimeInner( + sema: *Sema, + block: *Block, + src: LazySrcLoc, + msg: *Module.ErrorMsg, + src_loc: Module.SrcLoc, + ty: Type, + type_set: *TypeSet, +) CompileError!void { const mod = sema.mod; switch (ty.zigTypeTag()) { .Bool, @@ -19808,7 +19826,7 @@ fn explainWhyTypeIsComptime( }, .Array, .Vector => { - try sema.explainWhyTypeIsComptime(block, src, msg, src_loc, ty.elemType()); + try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.elemType(), type_set); }, .Pointer => { const elem_ty = ty.elemType2(); @@ -19826,18 +19844,20 @@ fn explainWhyTypeIsComptime( } return; } - try sema.explainWhyTypeIsComptime(block, src, msg, src_loc, ty.elemType()); + try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.elemType(), type_set); }, .Optional => { var buf: Type.Payload.ElemType = undefined; - try sema.explainWhyTypeIsComptime(block, src, msg, src_loc, ty.optionalChild(&buf)); + try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.optionalChild(&buf), type_set); }, .ErrorUnion => { - try sema.explainWhyTypeIsComptime(block, src, msg, src_loc, ty.errorUnionPayload()); + try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.errorUnionPayload(), type_set); }, .Struct => { + if ((try type_set.getOrPutContext(sema.gpa, ty, .{ .mod = mod })).found_existing) return; + if (ty.castTag(.@"struct")) |payload| { const struct_obj = payload.data; for (struct_obj.fields.values()) |field, i| { @@ -19845,9 +19865,10 @@ fn explainWhyTypeIsComptime( .index = i, .range = .type, }); + if (try sema.typeRequiresComptime(block, src, field.ty)) { try mod.errNoteNonLazy(field_src_loc, msg, "struct requires comptime because of this field", .{}); - try sema.explainWhyTypeIsComptime(block, src, msg, field_src_loc, field.ty); + try sema.explainWhyTypeIsComptimeInner(block, src, msg, field_src_loc, field.ty, type_set); } } } @@ -19855,6 +19876,8 @@ fn explainWhyTypeIsComptime( }, .Union => { + if ((try type_set.getOrPutContext(sema.gpa, ty, .{ .mod = mod })).found_existing) return; + if (ty.cast(Type.Payload.Union)) |payload| { const union_obj = payload.data; for (union_obj.fields.values()) |field, i| { @@ -19862,9 +19885,10 @@ fn explainWhyTypeIsComptime( .index = i, .range = .type, }); + if (try sema.typeRequiresComptime(block, src, field.ty)) { try mod.errNoteNonLazy(field_src_loc, msg, "union requires comptime because of this field", .{}); - try sema.explainWhyTypeIsComptime(block, src, msg, field_src_loc, field.ty); + try sema.explainWhyTypeIsComptimeInner(block, src, msg, field_src_loc, field.ty, type_set); } } } diff --git a/test/cases/compile_errors/AstGen_comptime_known_struct_is_resolved_before_error.zig b/test/cases/compile_errors/AstGen_comptime_known_struct_is_resolved_before_error.zig @@ -0,0 +1,19 @@ +const S1 = struct { + a: S2, +}; +const S2 = struct { + b: fn () void, +}; +pub export fn entry() void { + var s: S1 = undefined; + _ = s; +} + +// error +// backend=stage2 +// target=native +// +// :8:12: error: variable of type 'tmp.S1' must be const or comptime +// :2:8: note: struct requires comptime because of this field +// :5:8: note: struct requires comptime because of this field +// :5:8: note: use '*const fn() void' for a function pointer type diff --git a/test/cases/compile_errors/self_referential_struct_requires_comptime.zig b/test/cases/compile_errors/self_referential_struct_requires_comptime.zig @@ -0,0 +1,18 @@ +const S = struct { + a: fn () void, + b: *S, +}; +pub export fn entry() void { + var s: S = undefined; + _ = s; +} + + +// error +// backend=stage2 +// target=native +// +// :6:12: error: variable of type 'tmp.S' must be const or comptime +// :2:8: note: struct requires comptime because of this field +// :2:8: note: use '*const fn() void' for a function pointer type +// :3:8: note: struct requires comptime because of this field diff --git a/test/cases/compile_errors/self_referential_union_requires_comptime.zig b/test/cases/compile_errors/self_referential_union_requires_comptime.zig @@ -0,0 +1,17 @@ +const U = union { + a: fn () void, + b: *U, +}; +pub export fn entry() void { + var u: U = undefined; + _ = u; +} + +// error +// backend=stage2 +// target=native +// +// :6:12: error: variable of type 'tmp.U' must be const or comptime +// :2:8: note: union requires comptime because of this field +// :2:8: note: use '*const fn() void' for a function pointer type +// :3:8: note: union requires comptime because of this field