这里
消除引用 中 域
歧义.
推导std.typecons.Tuple.opBinary!"~"
时,应为return scope
,推导为了return ref
.
需要正确修复这个问题.
1,把return-ref
变成了return-scope
.
2,除非return-scope
,总是ref-return,里scope
.
推导属性前,escape.d
修改了TypeFunction
,在FuncDecl
的语义尾会替换掉,有复制存储类
.而有些复制函数忘记了returnScope
.
现在,可解锁12689了.
必须要改visit(CallExpe)
.新规则才能正常工作.你引入了STC.returnScope_和buildScopeRef
,我使用它.按scope return
重写return scope
.
问题是有3种表示dip1000
位的方法:
存储类,函数标志,域引用
.
这向funcflags
添加了isreturnscope
来按存储类
模仿returnScope
行为.我还要考虑一下
简单引入isreturnscope
,在FuncFlags
中正确设置.
用isreturnscope
在存储类
中为本
参设置returnScope
参数.
在逃逸分析
函数中为本
参使用ScopeRef
.
则可很好修复错误.
推导问题
纯函数可通过异常逃逸
对抛的强纯函数,不加域是有意义的.
除非使用-revert=dip1000,打印弃用消息
这里
因为如果只是强迫
使用-preview=dip1000
,那么简单的一行mars.d
就可以了,但是如果是类似DIP25
(我希望这样),那么也许"默认打开DIP1000"
将是更准确描述.
但是,DIP1000
仍然存在(多个)错误呢?
目的确实
是做对DIP25
所做的.我不认为"打开DIP1000"
是准确的.目标是先用弃用
消息来惹恼用户
并强迫他们使用-revert
让他们离开.一旦到位,实际上可默认
打开它.
此PR
是用户收到没有意义的弃用警告
-revert
解决它.
-preview
设计重点是降低
编译器中代码的进入门槛
,可淘汰并在野外尝试.如果在设计实际解决
之前就开始将DIP1000
设为默认值,那么我们既在-preview
失败了,也接受了不安全
代码,两种失败
-revert
是有选择地
禁用可能对某些用户
具有侵入性
的有效弃用类别
的方法.不是启用不完整预览开关
借口.
我们"只"必须修复错误.
DIP1000
确实存在错误
,但是,每个功能
都存在.当我们可放心地说"现在是默认启用dip1000
的时候了"时,安全何在?是否有任何需要
先修复的明显漏洞
?如果没有,我认为可以继续合并这个PR
.
大问题,与这里
DIP1000允许实现既定目标:@safe
引用计数.
我同意这是拦截器.DIP1000
由于漏洞
无法捕获
的所有内存安全
错误是一回事,而编译不是内存安全
代码是另一件事.
还有这个
我懂了.我开始以为"如果用户不使用DIP1000,则打印弃用消息",而不是"用-preview=dip1000"开始弃用会出错构造.
dmd修复不难(#12989),这里,难的是不破坏火卫一(dlang/phobos#8214),这里.事实证明,修复区间中scope错误很麻烦.不能显式标记每个参数为scope,因为它是通用代码,因此希望依赖推导.如果没有纯和不抛,则很难推导域(问题20674,并且错误消息也没用:
如果用@safe注解放/干放,那么会导致__traits(compiles)或is(typeof())测试失败,给出无用错误.
那么合并PR
时,我担心会发生什么?人们升级到dmd2.099
后会遇到大量难以理解的scope
弃用错误,其中许多错误是由于错误推导
而导致的误报
.他们想修复它们,但在论坛中询问如何修复
之后,他们得到答案是"没人知道
".因而我希望在将DIP1000
设为默认值之前将其置于良好,有据可查
的状态.
inout不隐含return
inout
不应隐含return
带推断@safe
的inout
方法逃逸
本地数据
删除return
,可破坏现在
代码.
意识到dip25
已是默认,使当前不再吸引人,毕竟修复错误并保留增强功能
更容易.