Author: hhinnant
Date: Fri Aug  3 17:02:07 2012
New Revision: 161267

URL: http://llvm.org/viewvc/llvm-project?rev=161267&view=rev
Log:
Fixes apple:  #12020687.  This was a problem in the demangler with template
substitution forward references.  That is, sometimes a mangled name refers to
a substitution that hasn't yet been defined.  The demangler was derferencing a
null pointer in this case because it wasn't properly guarded against a
forward reference.  Test case added to catch this problem.

Modified:
    libcxxabi/trunk/src/cxa_demangle.cpp
    libcxxabi/trunk/test/test_demangle.cpp

Modified: libcxxabi/trunk/src/cxa_demangle.cpp
URL: 
http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=161267&r1=161266&r2=161267&view=diff
==============================================================================
--- libcxxabi/trunk/src/cxa_demangle.cpp (original)
+++ libcxxabi/trunk/src/cxa_demangle.cpp Fri Aug  3 17:02:07 2012
@@ -17,7 +17,6 @@
 #include <algorithm>
 #include <assert.h>
 
-
 #ifdef DEBUGGING
 
 #include <string>
@@ -3701,6 +3700,8 @@
     }
     virtual bool is_function() const
     {
+        if (__left_ == 0)
+            return false;
         return __left_->is_function();
     }
     virtual bool is_cv_qualifer() const
@@ -9196,7 +9197,7 @@
             case 'v':
                 // cast <type>
                 {
-                const char* t = __parse_type(first+2, last, false);
+                const char* t = __parse_type(first+2, last, false, true);
                 if (t != first+2)
                 {
                     __node* cast_type = __root_;

Modified: libcxxabi/trunk/test/test_demangle.cpp
URL: 
http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.cpp?rev=161267&r1=161266&r2=161267&view=diff
==============================================================================
--- libcxxabi/trunk/test/test_demangle.cpp (original)
+++ libcxxabi/trunk/test/test_demangle.cpp Fri Aug  3 17:02:07 2012
@@ -29567,6 +29567,7 @@
     
{"_ZN2MF12_GLOBAL__N_114WeakCallHelperINS0_15DecodeQueueImplEEEvRKN5boost8functionIFvvEEERKNS3_8weak_ptrIT_EE",
 "void MF::(anonymous namespace)::WeakCallHelper<MF::(anonymous 
namespace)::DecodeQueueImpl>(boost::function<void ()> const&, 
boost::weak_ptr<MF::(anonymous namespace)::DecodeQueueImpl> const&)"},
     
{"_ZZN4NIds4NStr14TCStrAggregateINS0_13TCTCStrTraitsINS0_11TCStrTraitsIcNS0_17CDefaultStrParamsEEENS0_14TCStrImp_FixedIS5_Lx256EEEEEE21f_AddFromIteratorUTF8INS0_16CStrIteratorUTF8EEEvRxRKT_ENKSA_ISB_EUlmE0_clEm",
 "void 
NIds::NStr::TCStrAggregate<NIds::NStr::TCTCStrTraits<NIds::NStr::TCStrTraits<char,
 NIds::NStr::CDefaultStrParams>, 
NIds::NStr::TCStrImp_Fixed<NIds::NStr::TCStrTraits<char, 
NIds::NStr::CDefaultStrParams>, 256ll> > 
>::f_AddFromIteratorUTF8<NIds::NStr::CStrIteratorUTF8>(long long&, 
NIds::NStr::CStrIteratorUTF8 
const&)::NIds::NStr::TCStrAggregate<NIds::NStr::TCTCStrTraits<NIds::NStr::TCStrTraits<char,
 NIds::NStr::CDefaultStrParams>, 
NIds::NStr::TCStrImp_Fixed<NIds::NStr::TCStrTraits<char, 
NIds::NStr::CDefaultStrParams>, 256ll> > 
>::f_AddFromIteratorUTF8<NIds::NStr::CStrIteratorUTF8>::'lambda0'(unsigned 
long)::operator()(unsigned long) const"},
     
{"_ZZN4NIds4NStr14TCStrAggregateINS0_13TCTCStrTraitsINS0_11TCStrTraitsIcNS0_17CDefaultStrParamsEEENS0_14TCStrImp_FixedIS5_Lx256EEEEEE21f_AddFromIteratorUTF8INS0_16CStrIteratorUTF8EEEvRxRKT_ENKSA_ISB_EUt0_clEm",
 "void 
NIds::NStr::TCStrAggregate<NIds::NStr::TCTCStrTraits<NIds::NStr::TCStrTraits<char,
 NIds::NStr::CDefaultStrParams>, 
NIds::NStr::TCStrImp_Fixed<NIds::NStr::TCStrTraits<char, 
NIds::NStr::CDefaultStrParams>, 256ll> > 
>::f_AddFromIteratorUTF8<NIds::NStr::CStrIteratorUTF8>(long long&, 
NIds::NStr::CStrIteratorUTF8 
const&)::NIds::NStr::TCStrAggregate<NIds::NStr::TCTCStrTraits<NIds::NStr::TCStrTraits<char,
 NIds::NStr::CDefaultStrParams>, 
NIds::NStr::TCStrImp_Fixed<NIds::NStr::TCStrTraits<char, 
NIds::NStr::CDefaultStrParams>, 256ll> > 
>::f_AddFromIteratorUTF8<NIds::NStr::CStrIteratorUTF8>::'unnamed0'::operator()(unsigned
 long) const"},
+    {"_ZNK3com9markzware2js11cJSArgumentcvRKT_I8cMyClassEEv", 
"com::markzware::js::cJSArgument::operator cMyClass const &<cMyClass>() const"},
 };
 
 const unsigned N = sizeof(cases) / sizeof(cases[0]);


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to