| author | |
| committer | |
| log | 3debd6b732556832e58491cb153e1fee2cc8876b |
| tree | 6ae912f0b6163d0efa7f081bb66fe9556d41ddd8 |
| parent | 943f4eb515ec03499cf7b37d80b964e15502bfc8 |
| parent | 94662591d617226caabcb6c7319d703f1e41a880 |
| signature |
7 files changed, 133 insertions(+), 32 deletions(-)
ci/srht/update_download_page+10-7| ... | ... | @@ -100,6 +100,15 @@ cd "$SRCTARBALLDIR/ci/srht" |
| 100 | 100 | CIDIR="$(pwd)" |
| 101 | 101 | |
| 102 | 102 | cd "$HOME" |
| 103 | ||
| 104 | # Upload new stdlib autodocs | |
| 105 | mkdir -p docs_to_upload/documentation/master/std/ | |
| 106 | cp "$ZIGDIR/docs/std/index.html" docs_to_upload/documentation/master/std/index.html | |
| 107 | cp "$ZIGDIR/docs/std/data.js" docs_to_upload/documentation/master/std/data.js | |
| 108 | cp "$ZIGDIR/docs/std/main.js" docs_to_upload/documentation/master/std/main.js | |
| 109 | cp "$LANGREF" docs_to_upload/documentation/master/index.html | |
| 110 | $S3CMD put -P --no-mime-magic --recursive --add-header="Cache-Control: max-age=0, must-revalidate" "docs_to_upload/" s3://ziglang.org/ | |
| 111 | ||
| 103 | 112 | git clone --depth 1 git@github.com:ziglang/www.ziglang.org.git |
| 104 | 113 | cd www.ziglang.org |
| 105 | 114 | WWWDIR="$(pwd)" |
| ... | ... | @@ -108,12 +117,6 @@ $S3CMD put -P --no-mime-magic --add-header="cache-control: public, max-age=31536 |
| 108 | 117 | |
| 109 | 118 | cd "$WWWDIR" |
| 110 | 119 | cp "$CIDIR/out/index.json" data/releases.json |
| 111 | mkdir -p content/documentation/master/std | |
| 112 | cp "$LANGREF" content/documentation/master/index.html | |
| 113 | cp "$ZIGDIR/docs/std/index.html" content/documentation/master/std/index.html | |
| 114 | cp "$ZIGDIR/docs/std/data.js" content/documentation/master/std/data.js | |
| 115 | cp "$ZIGDIR/docs/std/main.js" content/documentation/master/std/main.js | |
| 116 | 120 | git add data/releases.json |
| 117 | git add content/ | |
| 118 | git commit -m "CI: update releases and docs" | |
| 121 | git commit -m "CI: update releases" | |
| 119 | 122 | git push origin master |
lib/docs/index.html+1| ... | ... | @@ -650,6 +650,7 @@ |
| 650 | 650 | <div id="sectSearchResults" class="hidden"> |
| 651 | 651 | <h2>Search Results</h2> |
| 652 | 652 | <ul id="listSearchResults"></ul> |
| 653 | <p id="sectSearchAllResultsLink" class="hidden"><a href="">show all results</a></p> | |
| 653 | 654 | </div> |
| 654 | 655 | <div id="sectSearchNoResults" class="hidden"> |
| 655 | 656 | <h2>No Results Found</h2> |
lib/docs/main.js+38-19| ... | ... | @@ -40,6 +40,7 @@ var zigAnalysis; |
| 40 | 40 | const domDeclNoRef = document.getElementById("declNoRef"); |
| 41 | 41 | const domSearch = document.getElementById("search"); |
| 42 | 42 | const domSectSearchResults = document.getElementById("sectSearchResults"); |
| 43 | const domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink"); | |
| 43 | 44 | |
| 44 | 45 | const domListSearchResults = document.getElementById("listSearchResults"); |
| 45 | 46 | const domSectSearchNoResults = document.getElementById("sectSearchNoResults"); |
| ... | ... | @@ -51,9 +52,8 @@ var zigAnalysis; |
| 51 | 52 | const domHelpModal = document.getElementById("helpModal"); |
| 52 | 53 | const domSearchPlaceholder = document.getElementById("searchPlaceholder"); |
| 53 | 54 | |
| 54 | domSearch.disabled = false; | |
| 55 | ||
| 56 | 55 | let searchTimer = null; |
| 56 | let searchTrimResults = true; | |
| 57 | 57 | |
| 58 | 58 | let escapeHtmlReplacements = { |
| 59 | 59 | "&": "&amp;", |
| ... | ... | @@ -105,6 +105,7 @@ var zigAnalysis; |
| 105 | 105 | // map of decl index to list of comptime fn calls |
| 106 | 106 | // let nodesToCallsMap = indexNodesToCalls(); |
| 107 | 107 | |
| 108 | domSearch.disabled = false; | |
| 108 | 109 | domSearch.addEventListener("keydown", onSearchKeyDown, false); |
| 109 | 110 | domSearch.addEventListener("focus", ev => { |
| 110 | 111 | domSearchPlaceholder.classList.add("hidden"); |
| ... | ... | @@ -113,6 +114,14 @@ var zigAnalysis; |
| 113 | 114 | if (domSearch.value.length == 0) |
| 114 | 115 | domSearchPlaceholder.classList.remove("hidden"); |
| 115 | 116 | }); |
| 117 | domSectSearchAllResultsLink.addEventListener('click', onClickSearchShowAllResults, false); | |
| 118 | function onClickSearchShowAllResults(ev) { | |
| 119 | ev.preventDefault(); | |
| 120 | ev.stopPropagation(); | |
| 121 | searchTrimResults = false; | |
| 122 | onHashChange(); | |
| 123 | } | |
| 124 | ||
| 116 | 125 | domPrivDeclsBox.addEventListener( |
| 117 | 126 | "change", |
| 118 | 127 | function () { |
| ... | ... | @@ -371,6 +380,7 @@ var zigAnalysis; |
| 371 | 380 | domSectFns.classList.add("hidden"); |
| 372 | 381 | domSectFields.classList.add("hidden"); |
| 373 | 382 | domSectSearchResults.classList.add("hidden"); |
| 383 | domSectSearchAllResultsLink.classList.add("hidden"); | |
| 374 | 384 | domSectSearchNoResults.classList.add("hidden"); |
| 375 | 385 | domSectInfo.classList.add("hidden"); |
| 376 | 386 | domHdrName.classList.add("hidden"); |
| ... | ... | @@ -3273,14 +3283,14 @@ var zigAnalysis; |
| 3273 | 3283 | let oldHash = location.hash; |
| 3274 | 3284 | let parts = oldHash.split("?"); |
| 3275 | 3285 | let newPart2 = domSearch.value === "" ? "" : "?" + domSearch.value; |
| 3276 | location.hash = | |
| 3277 | parts.length === 1 ? oldHash + newPart2 : parts[0] + newPart2; | |
| 3286 | location.replace(parts.length === 1 ? oldHash + newPart2 : parts[0] + newPart2); | |
| 3278 | 3287 | } |
| 3279 | 3288 | function getSearchTerms() { |
| 3280 | 3289 | let list = curNavSearch.trim().split(/[ \r\n\t]+/); |
| 3281 | 3290 | list.sort(); |
| 3282 | 3291 | return list; |
| 3283 | 3292 | } |
| 3293 | ||
| 3284 | 3294 | function renderSearch() { |
| 3285 | 3295 | let matchedItems = []; |
| 3286 | 3296 | let ignoreCase = curNavSearch.toLowerCase() === curNavSearch; |
| ... | ... | @@ -3346,28 +3356,37 @@ var zigAnalysis; |
| 3346 | 3356 | } |
| 3347 | 3357 | |
| 3348 | 3358 | if (matchedItems.length !== 0) { |
| 3349 | resizeDomList( | |
| 3350 | domListSearchResults, | |
| 3351 | matchedItems.length, | |
| 3352 | '<li><a href="#"></a></li>' | |
| 3353 | ); | |
| 3354 | ||
| 3355 | 3359 | matchedItems.sort(function (a, b) { |
| 3356 | 3360 | let cmp = operatorCompare(b.points, a.points); |
| 3357 | 3361 | if (cmp != 0) return cmp; |
| 3358 | 3362 | return operatorCompare(a.decl.name, b.decl.name); |
| 3359 | 3363 | }); |
| 3360 | 3364 | |
| 3365 | ||
| 3366 | var searchTrimmed = false | |
| 3367 | var searchTrimResultsMaxItems = 200 | |
| 3368 | if (searchTrimResults && matchedItems.length > searchTrimResultsMaxItems) { | |
| 3369 | matchedItems = matchedItems.slice(0, searchTrimResultsMaxItems) | |
| 3370 | searchTrimmed = true | |
| 3371 | } | |
| 3372 | ||
| 3373 | // Build up the list of search results | |
| 3374 | let matchedItemsHTML = ""; | |
| 3375 | ||
| 3361 | 3376 | for (let i = 0; i < matchedItems.length; i += 1) { |
| 3362 | let liDom = domListSearchResults.children[i]; | |
| 3363 | let aDom = liDom.children[0]; | |
| 3364 | let match = matchedItems[i]; | |
| 3365 | let lastPkgName = match.path.pkgNames[match.path.pkgNames.length - 1]; | |
| 3366 | aDom.textContent = lastPkgName + "." + match.path.declNames.join("."); | |
| 3367 | aDom.setAttribute( | |
| 3368 | "href", | |
| 3369 | navLink(match.path.pkgNames, match.path.declNames) | |
| 3370 | ); | |
| 3377 | const match = matchedItems[i]; | |
| 3378 | const lastPkgName = match.path.pkgNames[match.path.pkgNames.length - 1]; | |
| 3379 | ||
| 3380 | const text = lastPkgName + "." + match.path.declNames.join("."); | |
| 3381 | const href = navLink(match.path.pkgNames, match.path.declNames); | |
| 3382 | ||
| 3383 | matchedItemsHTML += "<li><a href=\""+ href +"\">"+ text + "</a></li>"; | |
| 3384 | } | |
| 3385 | ||
| 3386 | // Replace the search results using our newly constructed HTML string | |
| 3387 | domListSearchResults.innerHTML = matchedItemsHTML; | |
| 3388 | if (searchTrimmed) { | |
| 3389 | domSectSearchAllResultsLink.classList.remove("hidden"); | |
| 3371 | 3390 | } |
| 3372 | 3391 | renderSearchCursor(); |
| 3373 | 3392 |
src/Sema.zig+30-6| ... | ... | @@ -19764,6 +19764,8 @@ fn validateRunTimeType( |
| 19764 | 19764 | }; |
| 19765 | 19765 | } |
| 19766 | 19766 | |
| 19767 | const TypeSet = std.HashMapUnmanaged(Type, void, Type.HashContext64, std.hash_map.default_max_load_percentage); | |
| 19768 | ||
| 19767 | 19769 | fn explainWhyTypeIsComptime( |
| 19768 | 19770 | sema: *Sema, |
| 19769 | 19771 | block: *Block, |
| ... | ... | @@ -19771,6 +19773,22 @@ fn explainWhyTypeIsComptime( |
| 19771 | 19773 | msg: *Module.ErrorMsg, |
| 19772 | 19774 | src_loc: Module.SrcLoc, |
| 19773 | 19775 | ty: Type, |
| 19776 | ) CompileError!void { | |
| 19777 | var type_set = TypeSet{}; | |
| 19778 | defer type_set.deinit(sema.gpa); | |
| 19779 | ||
| 19780 | try sema.resolveTypeFully(block, src, ty); | |
| 19781 | return sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty, &type_set); | |
| 19782 | } | |
| 19783 | ||
| 19784 | fn explainWhyTypeIsComptimeInner( | |
| 19785 | sema: *Sema, | |
| 19786 | block: *Block, | |
| 19787 | src: LazySrcLoc, | |
| 19788 | msg: *Module.ErrorMsg, | |
| 19789 | src_loc: Module.SrcLoc, | |
| 19790 | ty: Type, | |
| 19791 | type_set: *TypeSet, | |
| 19774 | 19792 | ) CompileError!void { |
| 19775 | 19793 | const mod = sema.mod; |
| 19776 | 19794 | switch (ty.zigTypeTag()) { |
| ... | ... | @@ -19808,7 +19826,7 @@ fn explainWhyTypeIsComptime( |
| 19808 | 19826 | }, |
| 19809 | 19827 | |
| 19810 | 19828 | .Array, .Vector => { |
| 19811 | try sema.explainWhyTypeIsComptime(block, src, msg, src_loc, ty.elemType()); | |
| 19829 | try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.elemType(), type_set); | |
| 19812 | 19830 | }, |
| 19813 | 19831 | .Pointer => { |
| 19814 | 19832 | const elem_ty = ty.elemType2(); |
| ... | ... | @@ -19826,18 +19844,20 @@ fn explainWhyTypeIsComptime( |
| 19826 | 19844 | } |
| 19827 | 19845 | return; |
| 19828 | 19846 | } |
| 19829 | try sema.explainWhyTypeIsComptime(block, src, msg, src_loc, ty.elemType()); | |
| 19847 | try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.elemType(), type_set); | |
| 19830 | 19848 | }, |
| 19831 | 19849 | |
| 19832 | 19850 | .Optional => { |
| 19833 | 19851 | var buf: Type.Payload.ElemType = undefined; |
| 19834 | try sema.explainWhyTypeIsComptime(block, src, msg, src_loc, ty.optionalChild(&buf)); | |
| 19852 | try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.optionalChild(&buf), type_set); | |
| 19835 | 19853 | }, |
| 19836 | 19854 | .ErrorUnion => { |
| 19837 | try sema.explainWhyTypeIsComptime(block, src, msg, src_loc, ty.errorUnionPayload()); | |
| 19855 | try sema.explainWhyTypeIsComptimeInner(block, src, msg, src_loc, ty.errorUnionPayload(), type_set); | |
| 19838 | 19856 | }, |
| 19839 | 19857 | |
| 19840 | 19858 | .Struct => { |
| 19859 | if ((try type_set.getOrPutContext(sema.gpa, ty, .{ .mod = mod })).found_existing) return; | |
| 19860 | ||
| 19841 | 19861 | if (ty.castTag(.@"struct")) |payload| { |
| 19842 | 19862 | const struct_obj = payload.data; |
| 19843 | 19863 | for (struct_obj.fields.values()) |field, i| { |
| ... | ... | @@ -19845,9 +19865,10 @@ fn explainWhyTypeIsComptime( |
| 19845 | 19865 | .index = i, |
| 19846 | 19866 | .range = .type, |
| 19847 | 19867 | }); |
| 19868 | ||
| 19848 | 19869 | if (try sema.typeRequiresComptime(block, src, field.ty)) { |
| 19849 | 19870 | try mod.errNoteNonLazy(field_src_loc, msg, "struct requires comptime because of this field", .{}); |
| 19850 | try sema.explainWhyTypeIsComptime(block, src, msg, field_src_loc, field.ty); | |
| 19871 | try sema.explainWhyTypeIsComptimeInner(block, src, msg, field_src_loc, field.ty, type_set); | |
| 19851 | 19872 | } |
| 19852 | 19873 | } |
| 19853 | 19874 | } |
| ... | ... | @@ -19855,6 +19876,8 @@ fn explainWhyTypeIsComptime( |
| 19855 | 19876 | }, |
| 19856 | 19877 | |
| 19857 | 19878 | .Union => { |
| 19879 | if ((try type_set.getOrPutContext(sema.gpa, ty, .{ .mod = mod })).found_existing) return; | |
| 19880 | ||
| 19858 | 19881 | if (ty.cast(Type.Payload.Union)) |payload| { |
| 19859 | 19882 | const union_obj = payload.data; |
| 19860 | 19883 | for (union_obj.fields.values()) |field, i| { |
| ... | ... | @@ -19862,9 +19885,10 @@ fn explainWhyTypeIsComptime( |
| 19862 | 19885 | .index = i, |
| 19863 | 19886 | .range = .type, |
| 19864 | 19887 | }); |
| 19888 | ||
| 19865 | 19889 | if (try sema.typeRequiresComptime(block, src, field.ty)) { |
| 19866 | 19890 | try mod.errNoteNonLazy(field_src_loc, msg, "union requires comptime because of this field", .{}); |
| 19867 | try sema.explainWhyTypeIsComptime(block, src, msg, field_src_loc, field.ty); | |
| 19891 | try sema.explainWhyTypeIsComptimeInner(block, src, msg, field_src_loc, field.ty, type_set); | |
| 19868 | 19892 | } |
| 19869 | 19893 | } |
| 19870 | 19894 | } |
test/cases/compile_errors/AstGen_comptime_known_struct_is_resolved_before_error.zig created+19| ... | ... | @@ -0,0 +1,19 @@ |
| 1 | const S1 = struct { | |
| 2 | a: S2, | |
| 3 | }; | |
| 4 | const S2 = struct { | |
| 5 | b: fn () void, | |
| 6 | }; | |
| 7 | pub export fn entry() void { | |
| 8 | var s: S1 = undefined; | |
| 9 | _ = s; | |
| 10 | } | |
| 11 | ||
| 12 | // error | |
| 13 | // backend=stage2 | |
| 14 | // target=native | |
| 15 | // | |
| 16 | // :8:12: error: variable of type 'tmp.S1' must be const or comptime | |
| 17 | // :2:8: note: struct requires comptime because of this field | |
| 18 | // :5:8: note: struct requires comptime because of this field | |
| 19 | // :5:8: note: use '*const fn() void' for a function pointer type |
test/cases/compile_errors/self_referential_struct_requires_comptime.zig created+18| ... | ... | @@ -0,0 +1,18 @@ |
| 1 | const S = struct { | |
| 2 | a: fn () void, | |
| 3 | b: *S, | |
| 4 | }; | |
| 5 | pub export fn entry() void { | |
| 6 | var s: S = undefined; | |
| 7 | _ = s; | |
| 8 | } | |
| 9 | ||
| 10 | ||
| 11 | // error | |
| 12 | // backend=stage2 | |
| 13 | // target=native | |
| 14 | // | |
| 15 | // :6:12: error: variable of type 'tmp.S' must be const or comptime | |
| 16 | // :2:8: note: struct requires comptime because of this field | |
| 17 | // :2:8: note: use '*const fn() void' for a function pointer type | |
| 18 | // :3:8: note: struct requires comptime because of this field |
test/cases/compile_errors/self_referential_union_requires_comptime.zig created+17| ... | ... | @@ -0,0 +1,17 @@ |
| 1 | const U = union { | |
| 2 | a: fn () void, | |
| 3 | b: *U, | |
| 4 | }; | |
| 5 | pub export fn entry() void { | |
| 6 | var u: U = undefined; | |
| 7 | _ = u; | |
| 8 | } | |
| 9 | ||
| 10 | // error | |
| 11 | // backend=stage2 | |
| 12 | // target=native | |
| 13 | // | |
| 14 | // :6:12: error: variable of type 'tmp.U' must be const or comptime | |
| 15 | // :2:8: note: union requires comptime because of this field | |
| 16 | // :2:8: note: use '*const fn() void' for a function pointer type | |
| 17 | // :3:8: note: union requires comptime because of this field |