r206430 - Debug info: When collecting the parameters of C++ partial template

Richard Smith richard at metafoo.co.uk
Wed Apr 16 18:02:32 PDT 2014


On Wed, Apr 16, 2014 at 5:30 PM, Adrian Prantl <aprantl at apple.com> wrote:

> Author: adrian
> Date: Wed Apr 16 19:30:48 2014
> New Revision: 206430
>
> URL: http://llvm.org/viewvc/llvm-project?rev=206430&view=rev
> Log:
> Debug info: When collecting the parameters of C++ partial template
> specializations collect all arguments and not just the ones from the
> class template partial specialization from which this class template
> specialization was instantiated. The debug info does not represent the
> partial specialization otherwise and so specialized parameters would
> go missing.
>
> rdar://problem/16636569.
>
> Added:
>
> cfe/trunk/test/CodeGenCXX/debug-info-template-partial-specialization.cpp
> Modified:
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=206430&r1=206429&r2=206430&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Apr 16 19:30:48 2014
> @@ -1360,10 +1360,16 @@ CollectCXXTemplateParams(const ClassTemp
>                       ClassTemplatePartialSpecializationDecl *>
>      PU = TSpecial->getSpecializedTemplateOrPartial();
>
> -  TemplateParameterList *TPList = PU.is<ClassTemplateDecl *>() ?
> -    PU.get<ClassTemplateDecl *>()->getTemplateParameters() :
> -    PU.get<ClassTemplatePartialSpecializationDecl
> *>()->getTemplateParameters();
> -  const TemplateArgumentList &TAList =
> TSpecial->getTemplateInstantiationArgs();
> +  TemplateParameterList *TPList;
> +  if (auto *CTD = PU.dyn_cast<ClassTemplateDecl *>())
> +    TPList = CTD->getTemplateParameters();
> +  else {
> +    // Always get the full list of parameters, not just the ones from
> +    // the specialization.
> +    auto *CTPSD = PU.get<ClassTemplatePartialSpecializationDecl *>();
> +    TPList = CTPSD->getSpecializedTemplate()->getTemplateParameters();
> +  }
>

This is over-complicated; it's equivalent to:

TPList = TSpecial->getSpecializedTemplate()->getTemplateParameters();

+  const TemplateArgumentList &TAList = TSpecial->getTemplateArgs();
>    return CollectTemplateParams(TPList, TAList.asArray(), Unit);
>  }
>
>
> Added:
> cfe/trunk/test/CodeGenCXX/debug-info-template-partial-specialization.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-partial-specialization.cpp?rev=206430&view=auto
>
> ==============================================================================
> ---
> cfe/trunk/test/CodeGenCXX/debug-info-template-partial-specialization.cpp
> (added)
> +++
> cfe/trunk/test/CodeGenCXX/debug-info-template-partial-specialization.cpp
> Wed Apr 16 19:30:48 2014
> @@ -0,0 +1,31 @@
> +// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -g %s -o -
> -fstandalone-debug | FileCheck %s
> +namespace __pointer_type_imp
> +{
> +  template <class _Tp, class _Dp, bool > struct __pointer_type1 {};
> +
> +  // CHECK: metadata ![[PARAMS:[0-9]+]], metadata
> !"_ZTSN18__pointer_type_imp15__pointer_type1I1C14default_deleteIS1_ELb0EEE"}
> ; [ DW_TAG_structure_type ] [__pointer_type1<C, default_delete<C>, false>]
> [line [[@LINE+1]], size 8, align 8, offset 0] [def] [from ]
> +  template <class _Tp, class _Dp> struct __pointer_type1<_Tp, _Dp, false>
> +  {
> +    typedef _Tp* type;
> +  };
> +}
> +template <class _Tp, class _Dp>
> +struct __pointer_type2
> +{
> +  // Test that the bool template type parameter is emitted.
> +  //
> +  // CHECK: ![[PARAMS]] = metadata !{metadata !{{.*}}, metadata !{{.*}},
> metadata ![[FALSE:[0-9]+]]}
> +  // CHECK: ![[FALSE]] = {{.*}} i8 0, {{.*}}} ; [
> DW_TAG_template_value_parameter ]
> +  typedef typename __pointer_type_imp::__pointer_type1<_Tp, _Dp,
> false>::type type;
> +};
> +template <class _Tp> struct default_delete {};
> +template <class _Tp, class _Dp = default_delete<_Tp> > class unique_ptr
> +{
> +  typedef typename __pointer_type2<_Tp, _Dp>::type pointer;
> +  unique_ptr(pointer __p, _Dp __d) {}
> +};
> +class C {
> +  unique_ptr<C> Ptr;
> +};
> +void foo(C &c) {
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140416/5882601a/attachment.html>


More information about the cfe-commits mailing list