forked from OSchip/llvm-project
rdar://problem/11597911
Fix confusing error message about "expression did not evaluate to an address" when doing 'watchpoint set expression". Instead of using 0 as the fail_value when invoking ValueObject::GetValueAsUnsigned(), modify the API to take an addition bool pointer (defaults to NULL) to indicate success/failure of value conversion. llvm-svn: 158016
This commit is contained in:
parent
baa1ac260b
commit
3f476c4a72
|
@ -690,7 +690,7 @@ public:
|
|||
std::string& destination);
|
||||
|
||||
virtual uint64_t
|
||||
GetValueAsUnsigned (uint64_t fail_value);
|
||||
GetValueAsUnsigned (uint64_t fail_value, bool *success = NULL);
|
||||
|
||||
virtual bool
|
||||
SetValueFromCString (const char *value_str, Error& error);
|
||||
|
|
|
@ -1196,8 +1196,9 @@ CommandObjectWatchpointSetExpression::ExecuteRawCommandString
|
|||
}
|
||||
|
||||
// Get the address to watch.
|
||||
addr = valobj_sp->GetValueAsUnsigned(0);
|
||||
if (!addr) {
|
||||
bool success = false;
|
||||
addr = valobj_sp->GetValueAsUnsigned(0, &success);
|
||||
if (!success) {
|
||||
result.GetErrorStream().Printf("error: expression did not evaluate to an address\n");
|
||||
result.SetStatus(eReturnStatusFailed);
|
||||
return false;
|
||||
|
|
|
@ -1246,15 +1246,23 @@ ValueObject::GetValueAsCString ()
|
|||
// if > 8bytes, 0 is returned. this method should mostly be used
|
||||
// to read address values out of pointers
|
||||
uint64_t
|
||||
ValueObject::GetValueAsUnsigned (uint64_t fail_value)
|
||||
ValueObject::GetValueAsUnsigned (uint64_t fail_value, bool *success)
|
||||
{
|
||||
// If our byte size is zero this is an aggregate type that has children
|
||||
if (ClangASTContext::IsAggregateType (GetClangType()) == false)
|
||||
{
|
||||
Scalar scalar;
|
||||
if (ResolveValue (scalar))
|
||||
{
|
||||
if (success)
|
||||
*success = true;
|
||||
return scalar.GetRawBits64(fail_value);
|
||||
}
|
||||
// fallthrough, otherwise...
|
||||
}
|
||||
|
||||
if (success)
|
||||
*success = false;
|
||||
return fail_value;
|
||||
}
|
||||
|
||||
|
|
|
@ -61,6 +61,10 @@ class WatchpointSetErrorTestCase(TestBase):
|
|||
self.expect("watchpoint set expression -w write --", error=True,
|
||||
startstr = 'error: required argument missing; specify an expression to evaulate into the addres to watch for')
|
||||
|
||||
# It's an error if the expression did not evaluate to an address.
|
||||
self.expect("watchpoint set expression MyAggregateDataType", error=True,
|
||||
startstr = 'error: expression did not evaluate to an address')
|
||||
|
||||
# Check for missing option terminator '--'.
|
||||
self.expect("watchpoint set expression -w write -x 1 g_char_ptr", error=True,
|
||||
startstr = 'error: did you forget to enter the option terminator string "--"?')
|
||||
|
|
|
@ -98,6 +98,12 @@ int main (int argc, char const *argv[])
|
|||
err = ::pthread_create (&g_thread_2, NULL, thread_func, &thread_index_2);
|
||||
err = ::pthread_create (&g_thread_3, NULL, thread_func, &thread_index_3);
|
||||
|
||||
struct {
|
||||
int a;
|
||||
int b;
|
||||
int c;
|
||||
} MyAggregateDataType;
|
||||
|
||||
printf ("Before turning all three threads loose...\n"); // Set break point at this line.
|
||||
|
||||
// Join all of our threads
|
||||
|
|
Loading…
Reference in New Issue