<div dir="rtl"><div dir="ltr">Thanks!</div><div dir="ltr"><br></div><div dir="ltr">Small nitpick, the line "V = CGM.getCXXABI().EmitMemberPointer(MD);" has two extra spaces.</div><div dir="ltr"><br></div><div dir="ltr">Yaron</div><div dir="ltr"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div dir="ltr">2014-10-20 21:56 GMT+03:00 David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span>:</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dblaikie<br>
Date: Mon Oct 20 13:56:54 2014<br>
New Revision: 220221<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=220221&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=220221&view=rev</a><br>
Log:<br>
PR21312: Fix a regression in non-type template parameters of function type that are static member functions.<br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
    cfe/trunk/test/CodeGenCXX/debug-info-template.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=220221&r1=220220&r2=220221&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=220221&r1=220220&r2=220221&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Oct 20 13:56:54 2014<br>
@@ -1258,14 +1258,15 @@ CollectTemplateParams(const TemplatePara<br>
       QualType T = TA.getParamTypeForDecl().getDesugaredType(CGM.getContext());<br>
       llvm::DIType TTy = getOrCreateType(T, Unit);<br>
       llvm::Value *V = nullptr;<br>
+      const CXXMethodDecl *MD;<br>
       // Variable pointer template parameters have a value that is the address<br>
       // of the variable.<br>
       if (const auto *VD = dyn_cast<VarDecl>(D))<br>
         V = CGM.GetAddrOfGlobalVar(VD);<br>
       // Member function pointers have special support for building them, though<br>
       // this is currently unsupported in LLVM CodeGen.<br>
-      else if (const auto *method = dyn_cast<CXXMethodDecl>(D))<br>
-          V = CGM.getCXXABI().EmitMemberPointer(method);<br>
+      else if ((MD = dyn_cast<CXXMethodDecl>(D)) && MD->isInstance())<br>
+          V = CGM.getCXXABI().EmitMemberPointer(MD);<br>
       else if (const auto *FD = dyn_cast<FunctionDecl>(D))<br>
         V = CGM.GetAddrOfFunction(FD);<br>
       // Member data pointers have special handling too to compute the fixed<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/debug-info-template.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template.cpp?rev=220221&r1=220220&r2=220221&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template.cpp?rev=220221&r1=220220&r2=220221&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/debug-info-template.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/debug-info-template.cpp Mon Oct 20 13:56:54 2014<br>
@@ -5,7 +5,7 @@<br>
 // CHECK: [[RETAIN]] = metadata !{metadata !{{[0-9]]*}}, metadata [[FOO:![0-9]*]],<br>
<br>
<br>
-// CHECK: [[TC:![0-9]*]] = {{.*}}, metadata [[TCARGS:![0-9]*]], metadata !"{{.*}}"} ; [ DW_TAG_structure_type ] [TC<unsigned int, 2, &glb, &foo::e, &foo::f, &func, 1, 2, 3>]<br>
+// CHECK: [[TC:![0-9]*]] = {{.*}}, metadata [[TCARGS:![0-9]*]], metadata !"{{.*}}"} ; [ DW_TAG_structure_type ] [TC<unsigned int, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>]<br>
 // CHECK: [[TCARGS]] = metadata !{metadata [[TCARG1:![0-9]*]], metadata [[TCARG2:![0-9]*]], metadata [[TCARG3:![0-9]*]], metadata [[TCARG4:![0-9]*]], metadata [[TCARG5:![0-9]*]], metadata [[TCARG6:![0-9]*]], metadata [[TCARG7:![0-9]*]]}<br>
 //<br>
 // We seem to be missing file/line/col info on template value parameters -<br>
@@ -32,7 +32,7 @@<br>
 // CHECK: [[FARGS]] = metadata !{null, metadata [[FARG1:![0-9]*]]}<br>
 // CHECK: [[FARG1]] = {{.*}} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS3foo]<br>
 //<br>
-// CHECK: [[TCARG6]] = metadata !{metadata !"0x30\00f\00{{.*}}", {{[^,]+}}, metadata [[FUNPTR:![0-9]*]], void ()* @_Z4funcv, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
+// CHECK: [[TCARG6]] = metadata !{metadata !"0x30\00f\00{{.*}}", {{[^,]+}}, metadata [[FUNPTR:![0-9]*]], void ()* @_ZN3foo1gEv, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
 // CHECK: [[FUNPTR]] = {{.*}}, metadata [[FUNTYPE:![0-9]*]]} ; [ DW_TAG_pointer_type ]<br>
 // CHECK: [[FUNTYPE]] = {{.*}}, metadata [[FUNARGS:![0-9]*]], null, null, null} ; [ DW_TAG_subroutine_type ]<br>
 // CHECK: [[FUNARGS]] = metadata !{null}<br>
@@ -49,7 +49,7 @@<br>
 // CHECK: metadata !"0x2e\00f\00f\00_ZN3foo1fEv\00{{.*}}", metadata [[FTYPE:![0-9]*]], {{.*}} ; [ DW_TAG_subprogram ]<br>
 //<br>
<br>
-// CHECK: metadata !{metadata !"0x13\00{{.*}}", metadata !{{[0-9]*}}, metadata !"_ZTS2TCIjLj2EXadL_Z3glbEEXadL_ZN3foo1eEEEXadL_ZNS0_1fEvEEXadL_Z4funcvEEJLi1ELi2ELi3EEE", {{.*}}, metadata !"[[TCNESTED:.*]]"} ; [ DW_TAG_structure_type ] [nested]<br>
+// CHECK: metadata !{metadata !"0x13\00{{.*}}", metadata !{{[0-9]*}}, metadata !"_ZTS2TCIjLj2EXadL_Z3glbEEXadL_ZN3foo1eEEEXadL_ZNS0_1fEvEEXadL_ZNS0_1gEvEEJLi1ELi2ELi3EEE", {{.*}}, metadata !"[[TCNESTED:.*]]"} ; [ DW_TAG_structure_type ] [nested]<br>
 // CHECK: metadata [[TCNARGS:![0-9]*]], metadata !"[[TCNT:.*]]"} ; [ DW_TAG_structure_type ] [TC<int, -3, nullptr, nullptr, nullptr, nullptr>]<br>
 // CHECK: [[TCNARGS]] = metadata !{metadata [[TCNARG1:![0-9]*]], metadata [[TCNARG2:![0-9]*]], metadata [[TCNARG3:![0-9]*]], metadata [[TCNARG4:![0-9]*]], metadata [[TCNARG5:![0-9]*]], metadata [[TCNARG6:![0-9]*]], metadata [[TCNARG7:![0-9]*]]}<br>
 // CHECK: [[TCNARG1]] = metadata !{metadata !"0x2f\00T\000\000", null, metadata [[INT]], null} ; [ DW_TAG_template_type_parameter ]<br>
@@ -86,7 +86,7 @@<br>
 // CHECK: [[PTOARG1]] = metadata !{metadata !"0x30\00\000\000", null, metadata [[CONST_PADDINGATEND_PTR:![0-9]*]], %struct.PaddingAtEnd* @PaddedObj, null} ; [ DW_TAG_template_value_parameter ]<br>
 // CHECK: [[CONST_PADDINGATEND_PTR]] = {{.*}} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS12PaddingAtEnd]<br>
<br>
-// CHECK: metadata !"[[TCNESTED]]", %"struct.TC<unsigned int, 2, &glb, &foo::e, &foo::f, &func, 1, 2, 3>::nested"* @tci, null} ; [ DW_TAG_variable ] [tci]<br>
+// CHECK: metadata !"[[TCNESTED]]", %"struct.TC<unsigned int, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested"* @tci, null} ; [ DW_TAG_variable ] [tci]<br>
<br>
 // CHECK: metadata !"[[TCNT]]", %struct.TC* @tcn, null} ; [ DW_TAG_variable ] [tcn]<br>
<br>
@@ -95,6 +95,7 @@ struct foo {<br>
   char pad[8]; // make the member pointer to 'e' a bit more interesting (nonzero)<br>
   int e;<br>
   void f();<br>
+  static void g();<br>
 };<br>
<br>
 typedef int foo::*foo_mem;<br>
@@ -108,7 +109,7 @@ struct TC {<br>
 int glb;<br>
 void func();<br>
<br>
-TC<unsigned, 2, &glb, &foo::e, &foo::f, &func, 1, 2, 3>::nested tci;<br>
+TC<unsigned, 2, &glb, &foo::e, &foo::f, &foo::g, 1, 2, 3>::nested tci;<br>
 TC<int, -3, nullptr, nullptr, nullptr, nullptr> tcn;<br>
<br>
 template<typename><br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>