PortalPete wrote:

> I don't understand why step 2 is necessary; what does the optional actually 
> add? Is there a useful distinction between "I got an optional that was empty" 
> and "I got a ValueObjectSP with an error"? I didn't see any places where you 
> use that distinction.
> 
> Returning the optional is also awkward because we either have to check that 
> the optional had a value and THEN check that GetError().Success() returns 
> true, which is awkward, or we have to add the rule that if an optional return 
> is not empty, then the ValueObjectSP is not in the error state, which is also 
> a bit odd.

Step 2 is necessary now that the new sub-class design doesn't allow for `null` 
shared pointers. Returning an optional is now the (remaining) best option to 
for a function/method to say "I have nothing to return to you, but it's not an 
error" in its return value. 

The vast majority of places that return an error inside the Value Object return 
`ValueObjectSP`, not an optional of one.

I agree it's awkward, but you can think of it as a different way to represent 
the same awkwardness that's already been there with the existing tri-state 
approach:
- `valueObjectSP == nullptr`
- `valueObjectSP != nullptr` && `valueObjectSP->Fail()`
- `valueObjectSP != nullptr` && `valueObjectSP->Success()`

https://github.com/llvm/llvm-project/pull/77375
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to