[Lldb-commits] [lldb] r180938 - <rdar://problem/13338477>
Malea, Daniel
daniel.malea at intel.com
Thu May 2 14:57:06 PDT 2013
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
More information about the lldb-commits
mailing list