<div dir="ltr"><div>A reduced test case:</div><div><br></div><div>struct a {</div><div>  a(const char *);</div><div>};</div><div>template <typename b></div><div>void c() {</div><div>  a d(b::e ? "" : "");</div><div>}</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 19, 2017 at 5:57 PM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@gmail.com" target="_blank">benny.kra@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We should check VD->getInit()-><wbr>isValueDependent() before we call<br>
evaluateValue. I wasn't able to come up with a test case that triggers<br>
the assert though :(<br>
<div class="HOEnZb"><div class="h5"><br>
On Thu, Oct 19, 2017 at 5:45 PM, Alexander Kornienko <<a href="mailto:alexfh@google.com">alexfh@google.com</a>> wrote:<br>
><br>
><br>
> On Sat, Oct 14, 2017 at 5:59 PM, Benjamin Kramer via cfe-commits<br>
> <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
>><br>
>> Author: d0k<br>
>> Date: Sat Oct 14 08:59:34 2017<br>
>> New Revision: 315811<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=315811&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=315811&view=rev</a><br>
>> Log:<br>
>> Re-land r315787, "[Sema] Warn about unused variables if we can constant<br>
>> evaluate the initializer."<br>
>><br>
>> The warnings in libc++ tests were fixed in the meantime.<br>
>><br>
>> Modified:<br>
>>     cfe/trunk/lib/Sema/SemaDecl.<wbr>cpp<br>
>>     cfe/trunk/test/SemaCXX/warn-<wbr>unused-variables.cpp<br>
>><br>
>> Modified: cfe/trunk/lib/Sema/SemaDecl.<wbr>cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=315811&r1=315810&r2=315811&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaDecl.cpp?rev=315811&r1=<wbr>315810&r2=315811&view=diff</a><br>
>><br>
>> ==============================<wbr>==============================<wbr>==================<br>
>> --- cfe/trunk/lib/Sema/SemaDecl.<wbr>cpp (original)<br>
>> +++ cfe/trunk/lib/Sema/SemaDecl.<wbr>cpp Sat Oct 14 08:59:34 2017<br>
>> @@ -1723,7 +1723,8 @@ static bool ShouldDiagnoseUnusedDecl(con<br>
>>              dyn_cast<CXXConstructExpr>(<wbr>Init);<br>
>>            if (Construct && !Construct->isElidable()) {<br>
>>              CXXConstructorDecl *CD = Construct->getConstructor();<br>
>> -            if (!CD->isTrivial() && !RD->hasAttr<WarnUnusedAttr>()<wbr>)<br>
>> +            if (!CD->isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&<br>
>> +                !VD->evaluateValue())<br>
><br>
><br>
> The evaluateValue call above causes an assertion failure on<br>
> instantiation-dependent values:<br>
> llvm/tools/clang/lib/AST/Decl.<wbr>cpp:2196 in clang::APValue<br>
> *clang::VarDecl::<wbr>evaluateValue(SmallVectorImpl<<wbr>clang::PartialDiagnosticAt><br>
> &) const: !Init->isValueDependent()<br>
><br>
> I'm not sure why evaluateValue uses an assertion instead of outputting a<br>
> note and returning nullptr, but the assertion can be avoided on the caller<br>
> site as well.<br>
><br>
> Working on a reduced test case...<br>
><br>
>><br>
>>                return false;<br>
>>            }<br>
>>          }<br>
>><br>
>> Modified: cfe/trunk/test/SemaCXX/warn-<wbr>unused-variables.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unused-variables.cpp?rev=315811&r1=315810&r2=315811&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/warn-unused-variables.<wbr>cpp?rev=315811&r1=315810&r2=<wbr>315811&view=diff</a><br>
>><br>
>> ==============================<wbr>==============================<wbr>==================<br>
>> --- cfe/trunk/test/SemaCXX/warn-<wbr>unused-variables.cpp (original)<br>
>> +++ cfe/trunk/test/SemaCXX/warn-<wbr>unused-variables.cpp Sat Oct 14 08:59:34<br>
>> 2017<br>
>> @@ -1,4 +1,5 @@<br>
>>  // RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label<br>
>> -Wno-c++1y-extensions -verify %s<br>
>> +// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label<br>
>> -Wno-c++1y-extensions -verify -std=c++11 %s<br>
>>  template<typename T> void f() {<br>
>>    T t;<br>
>>    t = 17;<br>
>> @@ -194,3 +195,35 @@ void test() {<br>
>>  }<br>
>><br>
>>  }<br>
>> +<br>
>> +#if __cplusplus >= 201103L<br>
>> +namespace with_constexpr {<br>
>> +template <typename T><br>
>> +struct Literal {<br>
>> +  T i;<br>
>> +  Literal() = default;<br>
>> +  constexpr Literal(T i) : i(i) {}<br>
>> +};<br>
>> +<br>
>> +struct NoLiteral {<br>
>> +  int i;<br>
>> +  NoLiteral() = default;<br>
>> +  constexpr NoLiteral(int i) : i(i) {}<br>
>> +  ~NoLiteral() {}<br>
>> +};<br>
>> +<br>
>> +static Literal<int> gl1;          // expected-warning {{unused variable<br>
>> 'gl1'}}<br>
>> +static Literal<int> gl2(1);       // expected-warning {{unused variable<br>
>> 'gl2'}}<br>
>> +static const Literal<int> gl3(0); // expected-warning {{unused variable<br>
>> 'gl3'}}<br>
>> +<br>
>> +template <typename T><br>
>> +void test(int i) {<br>
>> +  Literal<int> l1;     // expected-warning {{unused variable 'l1'}}<br>
>> +  Literal<int> l2(42); // expected-warning {{unused variable 'l2'}}<br>
>> +  Literal<int> l3(i);  // no-warning<br>
>> +  Literal<T> l4(0);    // no-warning<br>
>> +  NoLiteral nl1;       // no-warning<br>
>> +  NoLiteral nl2(42);   // no-warning<br>
>> +}<br>
>> +}<br>
>> +#endif<br>
>><br>
>><br>
>> ______________________________<wbr>_________________<br>
>> cfe-commits mailing list<br>
>> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
><br>
><br>
</div></div></blockquote></div><br></div>