digitalmars.D - How to debug broken inference?
- Steven Schveighoffer (18/18) May 01 2020 I have a dilemma here. I have a non-trivial template function which is
- Steven Schveighoffer (14/19) May 01 2020 I figured out the issue. It was something very stupid, but probably a
- welkam (3/5) May 01 2020 onlineapp.d(3): Error: buf.ptr cannot be used in @safe code, use
- Steven Schveighoffer (7/16) May 01 2020 Yes, I know. That doesn't happen in my full use case. Which is why I
I have a dilemma here. I have a non-trivial template function which is inside a template struct, and this template is inferred to be system. I'm testing using a safe unittest. I put safe on the template to see which calls are actually system, and now it compiles. This is not a solution, because some template parameters might cause the function to truly be system, and then it just won't compile at all. I'm struggling to try and figure out how to properly make this function. Not only am I not sure what to test, but I will have to duplicate the function for both safe and system versions, or use a mixin. But this is going to be really painful. I very much depend on the compiler inferring safety for templates, and it's what we recommend to people who want to build their code for all purposes. Does anyone have any recommendations of how to approach this? Even if I wanted to report a bug, I have no idea why this is happening in this one spot. Why can't the compiler *try* safe and if it doesn't work, just decay to system? -Steve
May 01 2020
On 5/1/20 4:40 PM, Steven Schveighoffer wrote:Does anyone have any recommendations of how to approach this? Even if I wanted to report a bug, I have no idea why this is happening in this one spot. Why can't the compiler *try* safe and if it doesn't work, just decay to system?I figured out the issue. It was something very stupid, but probably a bug in the compiler. In my efforts to avoid bounds checking, I did this: char[4] buf; auto slice = buf.ptr[idx .. buf.length]; This compiles if it's tagged safe, but will not infer safety. But I don't need to do this trick anyway, it's a static array! So I just fixed that part of the code. But I'd say it's a bug in the compiler, it shouldn't accept that as safe. Indeed if I just put that in a function, it fails to compile as safe. I'll need to dustmite it. For reference, I used a manual dustmite-like process to narrow down this function to the part that fails. -Steve
May 01 2020
On Friday, 1 May 2020 at 21:04:34 UTC, Steven Schveighoffer wrote:char[4] buf; auto slice = buf.ptr[idx .. buf.length];onlineapp.d(3): Error: buf.ptr cannot be used in safe code, use &buf[0] instead
May 01 2020
On 5/1/20 6:46 PM, welkam wrote:On Friday, 1 May 2020 at 21:04:34 UTC, Steven Schveighoffer wrote:Yes, I know. That doesn't happen in my full use case. Which is why I said I need to dustmite it. But what I did find is that once I changed that line, then it infers safe. Essentially, there's a bug in the compiler that has to do with my whole project. -Stevechar[4] buf; auto slice = buf.ptr[idx .. buf.length];onlineapp.d(3): Error: buf.ptr cannot be used in safe code, use &buf[0] instead
May 01 2020