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:
Johnny Chen 2012-06-05 19:37:43 +00:00
parent baa1ac260b
commit 3f476c4a72
5 changed files with 23 additions and 4 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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 "--"?')

View File

@ -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