<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In our testing, we discovered a regression in 3.8 when trying to use both OpenCL and GCC vectors in the same program. Consider the following code:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Courier New";color:black">template <typename alpha><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Courier New";color:black">static void foo() {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Courier New";color:black"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Courier New";color:black">void bar() {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Courier New";color:black"> foo<float __attribute__((__vector_size__(16)))>();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Courier New";color:black"> foo<float __attribute__((ext_vector_type(4)))>();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Courier New";color:black">}<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In 3.7, the code compiled without any errors, but in 3.8 it fails to compile. The problem is that clang considers GCC and OpenCL vectors to be unique types, but since they mangle identically, the compiler instantiates two versions of foo
which are identical and emits an error:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:Consolas">repro.cpp:2:13: error: definition with same mangled name as another definition<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">static void foo() {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas"> ^<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">repro4.cpp:2:13: note: previous definition is here<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:Consolas">1 error generated.</span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The error is unfortunately not very helpful and was filed as PR25343. However, we feel that the compiler could be smarter in these cases. For example, the compiler could recognize that it is generating the same function when instantiating
the second instance of foo and reuse the first one instead of creating another one. This would prevent the creation of two identically mangled names which caused the error seen above. Or perhaps the compiler could be smarter and when it encounters the second
instantiation of foo, it would issue an error at that point with a useful diagnostic.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thoughts?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Douglas Yung<o:p></o:p></p>
</div>
</body>
</html>