8a57afe5a4
5684: Semantic highlighting for unsafe union field access r=jonas-schievink a=Nashenas88 This change adds support for unions in inference and lowering, then extends on that to add the unsafe semantic modifier on field access only. The `is_possibly_unsafe` function in `syntax_highlighting.rs` could be extended to support fns and static muts so that their definitions are not highlighted as unsafe, but only their usage. Also, each commit of this PR updates the tests. By reviewing the files by commit, it's easy to see how the changes in the code affected the tests. Co-authored-by: Paul Daniel Faria <Nashenas88@users.noreply.github.com>
72 lines
6.7 KiB
HTML
72 lines
6.7 KiB
HTML
|
|
<style>
|
|
body { margin: 0; }
|
|
pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padding: 0.4em; }
|
|
|
|
.lifetime { color: #DFAF8F; font-style: italic; }
|
|
.comment { color: #7F9F7F; }
|
|
.documentation { color: #629755; }
|
|
.injected { opacity: 0.65 ; }
|
|
.struct, .enum { color: #7CB8BB; }
|
|
.enum_variant { color: #BDE0F3; }
|
|
.string_literal { color: #CC9393; }
|
|
.field { color: #94BFF3; }
|
|
.function { color: #93E0E3; }
|
|
.function.unsafe { color: #BC8383; }
|
|
.operator.unsafe { color: #BC8383; }
|
|
.parameter { color: #94BFF3; }
|
|
.text { color: #DCDCCC; }
|
|
.type { color: #7CB8BB; }
|
|
.builtin_type { color: #8CD0D3; }
|
|
.type_param { color: #DFAF8F; }
|
|
.attribute { color: #94BFF3; }
|
|
.numeric_literal { color: #BFEBBF; }
|
|
.bool_literal { color: #BFE6EB; }
|
|
.macro { color: #94BFF3; }
|
|
.module { color: #AFD8AF; }
|
|
.value_param { color: #DCDCCC; }
|
|
.variable { color: #DCDCCC; }
|
|
.format_specifier { color: #CC696B; }
|
|
.mutable { text-decoration: underline; }
|
|
.escape_sequence { color: #94BFF3; }
|
|
.keyword { color: #F0DFAF; font-weight: bold; }
|
|
.keyword.unsafe { color: #BC8383; font-weight: bold; }
|
|
.control { font-style: italic; }
|
|
|
|
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
|
|
</style>
|
|
<pre><code><span class="keyword unsafe">unsafe</span> <span class="keyword">fn</span> <span class="function declaration unsafe">unsafe_fn</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
|
|
|
|
<span class="keyword">union</span> <span class="union declaration">Union</span> <span class="punctuation">{</span>
|
|
<span class="field declaration">a</span><span class="punctuation">:</span> <span class="builtin_type">u32</span><span class="punctuation">,</span>
|
|
<span class="field declaration">b</span><span class="punctuation">:</span> <span class="builtin_type">f32</span><span class="punctuation">,</span>
|
|
<span class="punctuation">}</span>
|
|
|
|
<span class="keyword">struct</span> <span class="struct declaration">HasUnsafeFn</span><span class="punctuation">;</span>
|
|
|
|
<span class="keyword">impl</span> <span class="struct">HasUnsafeFn</span> <span class="punctuation">{</span>
|
|
<span class="keyword unsafe">unsafe</span> <span class="keyword">fn</span> <span class="function declaration unsafe">unsafe_method</span><span class="punctuation">(</span><span class="operator">&</span><span class="self_keyword">self</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
|
|
<span class="punctuation">}</span>
|
|
|
|
<span class="keyword">struct</span> <span class="struct declaration">TypeForStaticMut</span> <span class="punctuation">{</span>
|
|
<span class="field declaration">a</span><span class="punctuation">:</span> <span class="builtin_type">u8</span>
|
|
<span class="punctuation">}</span>
|
|
|
|
<span class="keyword">static</span> <span class="keyword">mut</span> <span class="static declaration mutable unsafe">global_mut</span><span class="punctuation">:</span> <span class="struct">TypeForStaticMut</span> <span class="operator">=</span> <span class="struct">TypeForStaticMut</span> <span class="punctuation">{</span> <span class="field">a</span><span class="punctuation">:</span> <span class="numeric_literal">0</span> <span class="punctuation">}</span><span class="punctuation">;</span>
|
|
|
|
<span class="keyword">fn</span> <span class="function declaration">main</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span>
|
|
<span class="keyword">let</span> <span class="variable declaration">x</span> <span class="operator">=</span> <span class="operator">&</span><span class="numeric_literal">5</span> <span class="keyword">as</span> <span class="keyword">*</span><span class="keyword">const</span> <span class="builtin_type">usize</span><span class="punctuation">;</span>
|
|
<span class="keyword">let</span> <span class="variable declaration">u</span> <span class="operator">=</span> <span class="union">Union</span> <span class="punctuation">{</span> <span class="field">b</span><span class="punctuation">:</span> <span class="numeric_literal">0</span> <span class="punctuation">}</span><span class="punctuation">;</span>
|
|
<span class="keyword unsafe">unsafe</span> <span class="punctuation">{</span>
|
|
<span class="function unsafe">unsafe_fn</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span>
|
|
<span class="keyword">let</span> <span class="variable declaration">b</span> <span class="operator">=</span> <span class="variable">u</span><span class="punctuation">.</span><span class="field unsafe">b</span><span class="punctuation">;</span>
|
|
<span class="keyword control">match</span> <span class="variable">u</span> <span class="punctuation">{</span>
|
|
<span class="union">Union</span> <span class="punctuation">{</span> <span class="field unsafe">b</span><span class="punctuation">:</span> <span class="numeric_literal">0</span> <span class="punctuation">}</span> <span class="operator">=></span> <span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">,</span>
|
|
<span class="union">Union</span> <span class="punctuation">{</span> <span class="field unsafe">a</span> <span class="punctuation">}</span> <span class="operator">=></span> <span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">,</span>
|
|
<span class="punctuation">}</span>
|
|
<span class="struct">HasUnsafeFn</span><span class="punctuation">.</span><span class="function unsafe">unsafe_method</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span>
|
|
<span class="keyword">let</span> <span class="variable declaration">y</span> <span class="operator">=</span> <span class="operator unsafe">*</span><span class="punctuation">(</span><span class="variable">x</span><span class="punctuation">)</span><span class="punctuation">;</span>
|
|
<span class="keyword">let</span> <span class="variable declaration">z</span> <span class="operator">=</span> <span class="numeric_literal">-</span><span class="variable">x</span><span class="punctuation">;</span>
|
|
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="static mutable unsafe">global_mut</span><span class="punctuation">.</span><span class="field">a</span><span class="punctuation">;</span>
|
|
<span class="punctuation">}</span>
|
|
<span class="punctuation">}</span></code></pre> |