[Lldb-commits] [lldb] r180938 - <rdar://problem/13338477>

Enrico Granata egranata at apple.com
Thu May 2 15:31:36 PDT 2013


It doesn’t use anything OSX-specific. That error looks like the expression command is having some issues with “foo” more than anything
On Mac, the same test runs just fine with ToT LLDB and a fairly recent checkout of Clang
As a first step, you might want to mark it as @expectedFailureLinux until we figure it out
With that said, getting an expression parser log and sending it to Sean might be a start.

Enrico Granata
✉ egranata@.com
✆ 27683

On May 2, 2013, at 2:57 PM, "Malea, Daniel" <daniel.malea at intel.com> wrote:

> Hi Enrico, this test seems to be failing with:
> 
> runCmd: p *(int (*)[3])foo
> runCmd failed!
> error: use of undeclared identifier 'foo'
> error: 1 errors parsing expression
> 
> 
> FAIL
> 
> Executing tearDown hook: def cleanup():
>            self.runCmd('type format delete hex', check=False)
>            self.runCmd('type summary clear', check=False)
> 
> 
> 
> Can you take a look? It might need to be marked @expectedFailureLinux or
> the like, but I'm not sure if it uses anything Mac-OS-X specific.
> 
> 
> Thanks,
> Dan
> 
> 
> On 2013-05-02 2:54 PM, "Enrico Granata" <egranata at apple.com> wrote:
> 
>> Author: enrico
>> Date: Thu May  2 13:54:54 2013
>> New Revision: 180938
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=180938&view=rev
>> Log:
>> <rdar://problem/13338477>
>> 
>> clang sugarcoats expressions of the sort *(int (*)[3])foo where foo is an
>> int* saying that their type class is Paren
>> This checkin updates our lookup tables to properly desugar Paren into the
>> actual type of interest
>> 
>> 
>> Added:
>>   lldb/trunk/test/functionalities/data-formatter/rdar-13338477/
>>   lldb/trunk/test/functionalities/data-formatter/rdar-13338477/Makefile
>> 
>> lldb/trunk/test/functionalities/data-formatter/rdar-13338477/Test-rdar-133
>> 38477.py
>>   lldb/trunk/test/functionalities/data-formatter/rdar-13338477/main.cpp
>> Modified:
>>   lldb/trunk/source/Symbol/ClangASTContext.cpp
>>   lldb/trunk/source/Symbol/ClangASTType.cpp
>> 
>> Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTConte
>> xt.cpp?rev=180938&r1=180937&r2=180938&view=diff
>> ==========================================================================
>> ====
>> --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
>> +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Thu May  2 13:54:54 2013
>> @@ -170,6 +170,9 @@ GetCompleteQualType (clang::ASTContext *
>>    case clang::Type::Elaborated:
>>        return GetCompleteQualType (ast,
>> cast<ElaboratedType>(qual_type)->getNamedType(), allow_completion);
>> 
>> +    case clang::Type::Paren:
>> +        return GetCompleteQualType (ast,
>> cast<ParenType>(qual_type)->desugar(), allow_completion);
>> +
>>    default:
>>        break;
>>    }
>> @@ -1454,6 +1457,9 @@ ClangASTContext::SetHasExternalStorage (
>>    case clang::Type::Elaborated:
>>        return ClangASTContext::SetHasExternalStorage
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
>> has_extern);
>> 
>> +    case clang::Type::Paren:
>> +        return ClangASTContext::SetHasExternalStorage
>> (cast<ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
>> +
>>    default:
>>        break;
>>    }
>> @@ -2865,6 +2871,9 @@ ClangASTContext::GetNumTemplateArguments
>>            case clang::Type::Elaborated:
>>                return ClangASTContext::GetNumTemplateArguments (ast,
>> cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>> 
>> +            case clang::Type::Paren:
>> +                return ClangASTContext::GetNumTemplateArguments(ast,
>> cast<ParenType>(qual_type)->desugar().getAsOpaquePtr());
>> +                
>>            default:
>>                break;
>>        }
>> @@ -2941,6 +2950,9 @@ ClangASTContext::GetTemplateArgument (cl
>> 
>>            case clang::Type::Elaborated:
>>                return ClangASTContext::GetTemplateArgument (ast,
>> cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
>> arg_idx, kind);
>> +               
>> +            case clang::Type::Paren:
>> +                return ClangASTContext::GetTemplateArgument(ast,
>> cast<ParenType>(qual_type)->desugar().getAsOpaquePtr(), arg_idx, kind);
>> 
>>            default:
>>                break;
>> @@ -3065,6 +3077,12 @@ ClangASTContext::GetTypeInfo
>>        return ClangASTContext::GetTypeInfo
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
>>                                             ast,
>> 
>> pointee_or_element_clang_type);
>> +
>> +    case clang::Type::Paren:
>> +        return 
>> ClangASTContext::GetTypeInfo(llvm::cast<clang::ParenType>(qual_type)->desu
>> gar().getAsOpaquePtr(),
>> +                                            ast,
>> +                 
>> pointee_or_element_clang_type);
>> +
>>    case clang::Type::FunctionProto:                    return
>> eTypeIsFuncPrototype | eTypeHasValue;
>>    case clang::Type::FunctionNoProto:                  return
>> eTypeIsFuncPrototype | eTypeHasValue;
>>    case clang::Type::InjectedClassName:                return 0;
>> @@ -3155,7 +3173,8 @@ ClangASTContext::IsAggregateType (clang_
>>        return ClangASTContext::IsAggregateType
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>>    case clang::Type::Typedef:
>>        return ClangASTContext::IsAggregateType
>> (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaqueP
>> tr());
>> -
>> +    case clang::Type::Paren:
>> +        return ClangASTContext::IsAggregateType
>> (cast<ParenType>(qual_type)->desugar().getAsOpaquePtr());
>>    default:
>>        break;
>>    }
>> @@ -3333,6 +3352,12 @@ ClangASTContext::GetNumChildren (clang::
>> 
>> omit_empty_base_classes);
>>        break;
>> 
>> +    case clang::Type::Paren:
>> +        num_children = ClangASTContext::GetNumChildren(ast,
>> +                 
>> llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                 
>> omit_empty_base_classes);
>> +
>> +        break;
>>    default:
>>        break;
>>    }
>> @@ -3383,6 +3408,9 @@ ClangASTContext::GetNumDirectBaseClasses
>>            count = ClangASTContext::GetNumDirectBaseClasses (ast,
>> cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>>            break;
>> 
>> +        case clang::Type::Paren:
>> +            return ClangASTContext::GetNumDirectBaseClasses(ast,
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
>> +            
>>        default:
>>            break;
>>    }
>> @@ -3418,6 +3446,10 @@ ClangASTContext::GetNumVirtualBaseClasse
>>            count = ClangASTContext::GetNumVirtualBaseClasses (ast,
>> cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>>            break;
>> 
>> +        case clang::Type::Paren:
>> +            count = ClangASTContext::GetNumVirtualBaseClasses(ast,
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
>> +            break;
>> +
>>        default:
>>            break;
>>    }
>> @@ -3462,6 +3494,10 @@ ClangASTContext::GetNumFields (clang::AS
>>            count = ClangASTContext::GetNumFields (ast,
>> cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>>            break;
>> 
>> +        case clang::Type::Paren:
>> +            count = ClangASTContext::GetNumFields(ast,
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
>> +            break;
>> +            
>>        case clang::Type::ObjCObject:
>>        case clang::Type::ObjCInterface:
>>            if (GetCompleteQualType (ast, qual_type))
>> @@ -3562,6 +3598,12 @@ ClangASTContext::GetDirectBaseClassAtInd
>>                                                                idx,
>> 
>> bit_offset_ptr);
>> 
>> +        case clang::Type::Paren:
>> +            return  ClangASTContext::GetDirectBaseClassAtIndex (ast,
>> +                 
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                                                                idx,
>> +                 
>> bit_offset_ptr);
>> +            
>>        default:
>>            break;
>>    }
>> @@ -3621,6 +3663,12 @@ ClangASTContext::GetVirtualBaseClassAtIn
>>                                                                 idx,
>> 
>> bit_offset_ptr);
>> 
>> +        case clang::Type::Paren:
>> +            return  ClangASTContext::GetVirtualBaseClassAtIndex (ast,
>> +                 
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                                                                 idx,
>> +                 
>> bit_offset_ptr);
>> +
>>        default:
>>            break;
>>    }
>> @@ -3771,6 +3819,15 @@ ClangASTContext::GetFieldAtIndex (clang:
>> 
>> bitfield_bit_size_ptr,
>>                                                      is_bitfield_ptr);
>> 
>> +        case clang::Type::Paren:
>> +            return  ClangASTContext::GetFieldAtIndex (ast,
>> +                 
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                                                      idx,
>> +                                                      name,
>> +                                                      bit_offset_ptr,
>> +                 
>> bitfield_bit_size_ptr,
>> +                                                      is_bitfield_ptr);
>> +            
>>        default:
>>            break;
>>    }
>> @@ -3950,7 +4007,7 @@ ClangASTContext::GetNumPointeeChildren (
>>    case clang::Type::FunctionProto:            return 0;   // When we
>> function pointers, they have no children...
>>    case clang::Type::FunctionNoProto:          return 0;   // When we
>> function pointers, they have no children...
>>    case clang::Type::UnresolvedUsing:          return 0;
>> -    case clang::Type::Paren:                    return 0;
>> +    case clang::Type::Paren:                    return
>> ClangASTContext::GetNumPointeeChildren
>> (cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
>>    case clang::Type::Typedef:                  return
>> ClangASTContext::GetNumPointeeChildren
>> (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaqueP
>> tr());
>>    case clang::Type::Elaborated:               return
>> ClangASTContext::GetNumPointeeChildren
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>>    case clang::Type::TypeOfExpr:               return 0;
>> @@ -4494,7 +4551,25 @@ ClangASTContext::GetChildClangTypeAtInde
>>                                         child_bitfield_bit_size,
>>                                         child_bitfield_bit_offset,
>>                                         child_is_base_class,
>> -                                         child_is_deref_of_parent);
>> +                                         child_is_deref_of_parent);
>> +            
>> +    case clang::Type::Paren:
>> +        return GetChildClangTypeAtIndex (exe_ctx,
>> +                                         ast,
>> +                                         parent_name,
>> +                 
>> llvm::cast<clang::ParenType>(parent_qual_type)->desugar().getAsOpaquePtr()
>> ,
>> +                                         idx,
>> +                                         transparent_pointers,
>> +                                         omit_empty_base_classes,
>> +                                         ignore_array_bounds,
>> +                                         child_name,
>> +                                         child_byte_size,
>> +                                         child_byte_offset,
>> +                                         child_bitfield_bit_size,
>> +                                         child_bitfield_bit_offset,
>> +                                         child_is_base_class,
>> +                                         child_is_deref_of_parent);
>> +
>> 
>>    default:
>>        break;
>> @@ -4945,6 +5020,13 @@ ClangASTContext::GetIndexOfChildMemberWi
>>                                                  name,
>> 
>> omit_empty_base_classes,
>>                                                  child_indexes);
>> +                
>> +        case clang::Type::Paren:
>> +            return GetIndexOfChildMemberWithName (ast,
>> +                 
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                                                  name,
>> +                 
>> omit_empty_base_classes,
>> +                                                  child_indexes);
>> 
>>        default:
>>            break;
>> @@ -5159,6 +5241,12 @@ ClangASTContext::GetIndexOfChildWithName
>>                                            name,
>>                                            omit_empty_base_classes);
>> 
>> +        case clang::Type::Paren:
>> +            return GetIndexOfChildWithName (ast,
>> +                 
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                                            name,
>> +                                            omit_empty_base_classes);
>> +
>>        case clang::Type::Typedef:
>>            return GetIndexOfChildWithName (ast,
>> 
>> cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePt
>> r(),
>> @@ -5235,6 +5323,7 @@ ClangASTContext::GetDeclContextForType (
>>    case clang::Type::Enum:                     return
>> cast<EnumType>(qual_type)->getDecl();
>>    case clang::Type::Typedef:                  return
>> ClangASTContext::GetDeclContextForType
>> (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaqueP
>> tr());
>>    case clang::Type::Elaborated:               return
>> ClangASTContext::GetDeclContextForType
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>> +    case clang::Type::Paren:                    return
>> ClangASTContext::GetDeclContextForType
>> (cast<ParenType>(qual_type)->desugar().getAsOpaquePtr());
>>    case clang::Type::TypeOfExpr:               break;
>>    case clang::Type::TypeOf:                   break;
>>    case clang::Type::Decltype:                 break;
>> @@ -5246,7 +5335,6 @@ ClangASTContext::GetDeclContextForType (
>>    case clang::Type::SubstTemplateTypeParmPack:break;
>>    case clang::Type::PackExpansion:            break;
>>    case clang::Type::UnresolvedUsing:          break;
>> -    case clang::Type::Paren:                    break;
>>    case clang::Type::Attributed:               break;
>>    case clang::Type::Auto:                     break;
>>    case clang::Type::InjectedClassName:        break;
>> @@ -5827,7 +5915,13 @@ ClangASTContext::IsPossibleDynamicType (
>> 
>> dynamic_pointee_type,
>> 
>> check_cplusplus,
>> 
>> check_objc);
>> -            
>> +
>> +            case clang::Type::Paren:
>> +                return ClangASTContext::IsPossibleDynamicType (ast,
>> +                 
>> cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                 
>> dynamic_pointee_type,
>> +                 
>> check_cplusplus,
>> +                 
>> check_objc);
>>            default:
>>                break;
>>        }
>> @@ -5983,6 +6077,9 @@ ClangASTContext::IsReferenceType (clang_
>>        return ClangASTContext::IsReferenceType
>> (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaqueP
>> tr());
>>    case clang::Type::Elaborated:
>>        return ClangASTContext::IsReferenceType
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>> +    case clang::Type::Paren:
>> +        return ClangASTContext::IsReferenceType
>> (cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
>> +
>>    default:
>>        break;
>>    }
>> @@ -6038,6 +6135,8 @@ ClangASTContext::IsPointerOrReferenceTyp
>>        return ClangASTContext::IsPointerOrReferenceType
>> (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaqueP
>> tr());
>>    case clang::Type::Elaborated:
>>        return ClangASTContext::IsPointerOrReferenceType
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>> +    case clang::Type::Paren:
>> +        return ClangASTContext::IsPointerOrReferenceType
>> (cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
>>    default:
>>        break;
>>    }
>> @@ -6107,6 +6206,8 @@ ClangASTContext::IsPointerType (clang_ty
>>            return ClangASTContext::IsPointerType
>> (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaqueP
>> tr(), target_type);
>>        case clang::Type::Elaborated:
>>            return ClangASTContext::IsPointerType
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
>> target_type);
>> +        case clang::Type::Paren:
>> +            return ClangASTContext::IsPointerType
>> (cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> target_type);
>>        default:
>>            break;
>>        }
>> @@ -6354,6 +6455,8 @@ ClangASTContext::IsFunctionPointerType (
>>            return ClangASTContext::IsFunctionPointerType
>> (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaqueP
>> tr());
>>        case clang::Type::Elaborated:
>>            return ClangASTContext::IsFunctionPointerType
>> (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
>> +        case clang::Type::Paren:
>> +            return ClangASTContext::IsFunctionPointerType
>> (cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
>> 
>>        case clang::Type::LValueReference:
>>        case clang::Type::RValueReference:
>> @@ -6390,6 +6493,9 @@ ClangASTContext::GetArraySize (clang_typ
>> 
>>        case clang::Type::Elaborated:
>>            return
>> ClangASTContext::GetArraySize(cast<ElaboratedType>(qual_type)->getNamedTyp
>> e().getAsOpaquePtr());
>> +
>> +        case clang::Type::Paren:
>> +            return
>> ClangASTContext::GetArraySize(cast<clang::ParenType>(qual_type)->desugar()
>> .getAsOpaquePtr());
>> 
>>        default:
>>            break;
>> @@ -6455,6 +6561,11 @@ ClangASTContext::GetAsArrayType (clang_t
>>                                                member_type,
>>                                                size,
>>                                                is_incomplete);
>> +    case clang::Type::Paren:
>> +        return ClangASTContext::GetAsArrayType
>> (cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                                                member_type,
>> +                                                size,
>> +                                                is_incomplete);
>>    }
>>    return 0;
>> }
>> 
>> Modified: lldb/trunk/source/Symbol/ClangASTType.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTType.
>> cpp?rev=180938&r1=180937&r2=180938&view=diff
>> ==========================================================================
>> ====
>> --- lldb/trunk/source/Symbol/ClangASTType.cpp (original)
>> +++ lldb/trunk/source/Symbol/ClangASTType.cpp Thu May  2 13:54:54 2013
>> @@ -251,7 +251,8 @@ ClangASTType::GetTypeClass (clang::ASTCo
>>        case clang::Type::Enum:                     return
>> lldb::eTypeClassEnumeration;
>>        case clang::Type::Typedef:                  return
>> lldb::eTypeClassTypedef;
>>        case clang::Type::UnresolvedUsing:          break;
>> -        case clang::Type::Paren:                    break;
>> +        case clang::Type::Paren:
>> +            return ClangASTType::GetTypeClass (ast_context,
>> llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
>>        case clang::Type::Elaborated:
>>            return ClangASTType::GetTypeClass (ast_context,
>> llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePt
>> r());
>> 
>> @@ -464,10 +465,12 @@ ClangASTType::GetEncoding (clang_type_t
>>    case clang::Type::Elaborated:
>>        return ClangASTType::GetEncoding
>> (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaqueP
>> tr(), count);
>> 
>> +    case clang::Type::Paren:
>> +        return ClangASTType::GetEncoding
>> (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> count);
>> +            
>>    case clang::Type::DependentSizedArray:
>>    case clang::Type::DependentSizedExtVector:
>>    case clang::Type::UnresolvedUsing:
>> -    case clang::Type::Paren:
>>    case clang::Type::Attributed:
>>    case clang::Type::TemplateTypeParm:
>>    case clang::Type::SubstTemplateTypeParm:
>> @@ -519,7 +522,7 @@ ClangASTType::GetFormat (clang_type_t cl
>>        break;
>> 
>>    case clang::Type::ConstantArray:
>> -        break;
>> +        return lldb::eFormatVoid; // no value
>> 
>>    case clang::Type::ExtVector:
>>    case clang::Type::Vector:
>> @@ -597,12 +600,13 @@ ClangASTType::GetFormat (clang_type_t cl
>>        return 
>> ClangASTType::GetFormat(llvm::cast<clang::TypedefType>(qual_type)->getDecl
>> ()->getUnderlyingType().getAsOpaquePtr());
>>    case clang::Type::Auto:
>>        return 
>> ClangASTType::GetFormat(llvm::cast<clang::AutoType>(qual_type)->desugar().
>> getAsOpaquePtr());
>> +    case clang::Type::Paren:
>> +        return 
>> ClangASTType::GetFormat(llvm::cast<clang::ParenType>(qual_type)->desugar()
>> .getAsOpaquePtr());
>>    case clang::Type::Elaborated:
>>        return 
>> ClangASTType::GetFormat(llvm::cast<clang::ElaboratedType>(qual_type)->getN
>> amedType().getAsOpaquePtr());
>>    case clang::Type::DependentSizedArray:
>>    case clang::Type::DependentSizedExtVector:
>>    case clang::Type::UnresolvedUsing:
>> -    case clang::Type::Paren:
>>    case clang::Type::Attributed:
>>    case clang::Type::TemplateTypeParm:
>>    case clang::Type::SubstTemplateTypeParm:
>> @@ -950,6 +954,31 @@ ClangASTType::DumpValue
>>                              depth);             // Scope depth for any
>> types that have children
>>        }
>>        break;
>> +            
>> +    case clang::Type::Paren:
>> +    {
>> +        clang::QualType desugar_qual_type =
>> llvm::cast<clang::ParenType>(qual_type)->desugar();
>> +        lldb::Format desugar_format =
>> ClangASTType::GetFormat(desugar_qual_type.getAsOpaquePtr());
>> +        std::pair<uint64_t, unsigned> desugar_type_info =
>> ast_context->getTypeInfo(desugar_qual_type);
>> +        uint64_t desugar_byte_size = desugar_type_info.first / 8;
>> +        
>> +        return DumpValue (ast_context,        // The clang AST context
>> for this type
>> +                          desugar_qual_type.getAsOpaquePtr(),    // The
>> clang type we want to dump
>> +                          exe_ctx,
>> +                          s,                  // Stream to dump to
>> +                          desugar_format,  // The format with which to
>> display the element
>> +                          data,               // Data buffer containing
>> all bytes for this type
>> +                          data_byte_offset,   // Offset into "data"
>> where to grab value from
>> +                          desugar_byte_size,  // Size of this type in
>> bytes
>> +                          bitfield_bit_size,  // Bitfield bit size
>> +                          bitfield_bit_offset,// Bitfield bit offset
>> +                          show_types,         // Boolean indicating if
>> we should show the variable types
>> +                          show_summary,       // Boolean indicating if
>> we should show a summary for the current type
>> +                          verbose,            // Verbose output?
>> +                          depth);             // Scope depth for any
>> types that have children
>> +    }
>> +        break;
>> +
>>    default:
>>        // We are down the a scalar type that we just need to display.
>>        data.Dump(s, data_byte_offset, format, data_byte_size, 1,
>> UINT32_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size, bitfield_bit_offset);
>> @@ -1390,6 +1419,12 @@ ClangASTType::DumpTypeDescription (clang
>>                                 s);
>>            return;
>> 
>> +        case clang::Type::Paren:
>> +            DumpTypeDescription (ast_context,
>> +                 
>> llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
>> +                                 s);
>> +            return;
>> +
>>        case clang::Type::Record:
>>            {
>>                ClangASTContext::GetCompleteType (ast_context,
>> clang_type);
>> 
>> Added: 
>> lldb/trunk/test/functionalities/data-formatter/rdar-13338477/Makefile
>> URL: 
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-f
>> ormatter/rdar-13338477/Makefile?rev=180938&view=auto
>> ==========================================================================
>> ====
>> --- lldb/trunk/test/functionalities/data-formatter/rdar-13338477/Makefile
>> (added)
>> +++ lldb/trunk/test/functionalities/data-formatter/rdar-13338477/Makefile
>> Thu May  2 13:54:54 2013
>> @@ -0,0 +1,5 @@
>> +LEVEL = ../../../make
>> +
>> +CXX_SOURCES := main.cpp
>> +
>> +include $(LEVEL)/Makefile.rules
>> 
>> Added: 
>> lldb/trunk/test/functionalities/data-formatter/rdar-13338477/Test-rdar-133
>> 38477.py
>> URL: 
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-f
>> ormatter/rdar-13338477/Test-rdar-13338477.py?rev=180938&view=auto
>> ==========================================================================
>> ====
>> --- 
>> lldb/trunk/test/functionalities/data-formatter/rdar-13338477/Test-rdar-133
>> 38477.py (added)
>> +++ 
>> lldb/trunk/test/functionalities/data-formatter/rdar-13338477/Test-rdar-133
>> 38477.py Thu May  2 13:54:54 2013
>> @@ -0,0 +1,70 @@
>> +"""
>> +Test lldb data formatter subsystem.
>> +"""
>> +
>> +import os, time
>> +import unittest2
>> +import lldb
>> +from lldbtest import *
>> +import lldbutil
>> +
>> +class Radar13338477DataFormatterTestCase(TestBase):
>> +
>> +    # test for rdar://problem/13338477 ()
>> +    mydir = os.path.join("functionalities", "data-formatter",
>> "rdar-13338477")
>> +
>> +    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires
>> Darwin")
>> +    @dsym_test
>> +    def test_with_dsym_and_run_command(self):
>> +        """Test that LLDB handles the clang typeclass Paren correctly."""
>> +        self.buildDsym()
>> +        self.data_formatter_commands()
>> +
>> +    @dwarf_test
>> +    def test_with_dwarf_and_run_command(self):
>> +        """Test that LLDB handles the clang typeclass Paren correctly."""
>> +        self.buildDwarf()
>> +        self.data_formatter_commands()
>> +
>> +    def setUp(self):
>> +        # Call super's setUp().
>> +        TestBase.setUp(self)
>> +        # Find the line number to break at.
>> +        self.line = line_number('main.cpp', '// Set break point at this
>> line.')
>> +
>> +    def data_formatter_commands(self):
>> +        """Test that LLDB handles the clang typeclass Paren correctly."""
>> +        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
>> +
>> +        lldbutil.run_break_set_by_file_and_line (self, "main.cpp",
>> self.line, num_expected_locations=1, loc_exact=True)
>> +
>> +        self.runCmd("run", RUN_SUCCEEDED)
>> +
>> +        # The stop reason of the thread should be breakpoint.
>> +        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
>> +            substrs = ['stopped',
>> +                       'stop reason = breakpoint'])
>> +
>> +        # This is the function to remove the custom formats in order to
>> have a
>> +        # clean slate for the next test case.
>> +        def cleanup():
>> +            self.runCmd('type format delete hex', check=False)
>> +            self.runCmd('type summary clear', check=False)
>> +
>> +        # Execute the cleanup function during test case tear down.
>> +        self.addTearDownHook(cleanup)
>> +
>> +        self.expect('p *(int (*)[3])foo',
>> +            substrs = ['(int [3]) $',' = {','[0] = 1','[1] = 2','[2] =
>> 3'])
>> +
>> +        self.expect('p *(int (*)[3])foo', matching=False,
>> +            substrs = ['01 00 00 00 02 00 00 00 03 00 00 00'])
>> +        self.expect('p *(int (*)[3])foo', matching=False,
>> +            substrs = ['0x000000030000000200000001'])
>> +
>> +
>> +if __name__ == '__main__':
>> +    import atexit
>> +    lldb.SBDebugger.Initialize()
>> +    atexit.register(lambda: lldb.SBDebugger.Terminate())
>> +    unittest2.main()
>> 
>> Added: 
>> lldb/trunk/test/functionalities/data-formatter/rdar-13338477/main.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-f
>> ormatter/rdar-13338477/main.cpp?rev=180938&view=auto
>> ==========================================================================
>> ====
>> --- lldb/trunk/test/functionalities/data-formatter/rdar-13338477/main.cpp
>> (added)
>> +++ lldb/trunk/test/functionalities/data-formatter/rdar-13338477/main.cpp
>> Thu May  2 13:54:54 2013
>> @@ -0,0 +1,17 @@
>> +//===-- main.cpp ------------------------------------------------*- C++
>> -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===--------------------------------------------------------------------
>> --===//
>> +
>> +void bar(int const *foo) {
>> +  __builtin_trap(); // Set break point at this line.
>> +}
>> +
>> +int main() {
>> +  int foo[] = {1,2,3};
>> +  bar(foo);
>> +}
>> 
>> 
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20130502/624bd126/attachment.html>


More information about the lldb-commits mailing list