<div dir="ltr">Sorry, a C++11ism slipped in, removed in r201621. Is this a C++98 bot?</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Feb 18, 2014 at 5:01 PM, Juergen Ributzka <span dir="ltr"><<a href="mailto:juergen@apple.com" target="_blank">juergen@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Richard,<br>
<br>
this breaks one of our internal build bots with the following error message:<br>
tools/clang/lib/Sema/SemaType.cpp:1133:9: error: non-aggregate type 'std::pair<DeclSpec::TQ, SourceLocation>' cannot be initialized with an initializer list<br>
        { DeclSpec::TQ_const, DS.getConstSpecLoc() },<br>
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
tools/clang/lib/Sema/SemaType.cpp:1134:9: error: non-aggregate type 'std::pair<DeclSpec::TQ, SourceLocation>' cannot be initialized with an initializer list<br>
        { DeclSpec::TQ_volatile, DS.getVolatileSpecLoc() },<br>
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
tools/clang/lib/Sema/SemaType.cpp:1135:9: error: non-aggregate type 'std::pair<DeclSpec::TQ, SourceLocation>' cannot be initialized with an initializer list<br>
        { DeclSpec::TQ_atomic, DS.getAtomicSpecLoc() }<br>
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
<br>
Could you please take a look?<br>
<br>
Thanks<br>
<br>
Cheers,<br>
Juergen<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On Feb 18, 2014, at 4:13 PM, Richard Smith <<a href="mailto:richard-llvm@metafoo.co.uk">richard-llvm@metafoo.co.uk</a>> wrote:<br>
<br>
> Author: rsmith<br>
> Date: Tue Feb 18 18:13:27 2014<br>
> New Revision: 201620<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=201620&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=201620&view=rev</a><br>
> Log:<br>
> PR13110: Add a -Wignored-qualifiers warning when ignoring a const, volatile, or<br>
> _Atomic qualifier applied to a reference type.<br>
><br>
> Modified:<br>
>    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
>    cfe/trunk/lib/Sema/SemaType.cpp<br>
>    cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.ref/p6-0x.cpp<br>
>    cfe/trunk/test/CXX/drs/dr1xx.cpp<br>
>    cfe/trunk/test/Parser/cxx-reference.cpp<br>
>    cfe/trunk/test/Parser/cxx0x-rvalue-reference.cpp<br>
>    cfe/trunk/test/SemaCXX/references.cpp<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=201620&r1=201619&r2=201620&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=201620&r1=201619&r2=201620&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Feb 18 18:13:27 2014<br>
> @@ -3787,6 +3787,9 @@ def warn_typecheck_negative_array_new_si<br>
>   InGroup<BadArrayNewLength>;<br>
> def warn_typecheck_function_qualifiers : Warning<<br>
>   "qualifier on function type %0 has unspecified behavior">;<br>
> +def warn_typecheck_reference_qualifiers : Warning<<br>
> +  "'%0' qualifier on reference type %1 has no effect">,<br>
> +  InGroup<IgnoredQualifiers>;<br>
> def err_typecheck_invalid_restrict_not_pointer : Error<<br>
>   "restrict requires a pointer or reference (%0 is invalid)">;<br>
> def err_typecheck_invalid_restrict_not_pointer_noarg : Error<<br>
><br>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=201620&r1=201619&r2=201620&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=201620&r1=201619&r2=201620&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)<br>
> +++ cfe/trunk/lib/Sema/SemaType.cpp Tue Feb 18 18:13:27 2014<br>
> @@ -1117,17 +1117,32 @@ static QualType ConvertDeclSpecToType(Ty<br>
>       }<br>
>     }<br>
><br>
> -    // C++ [dcl.ref]p1:<br>
> +    // C++11 [dcl.ref]p1:<br>
>     //   Cv-qualified references are ill-formed except when the<br>
> -    //   cv-qualifiers are introduced through the use of a typedef<br>
> -    //   (7.1.3) or of a template type argument (14.3), in which<br>
> -    //   case the cv-qualifiers are ignored.<br>
> -    // FIXME: Shouldn't we be checking SCS_typedef here?<br>
> +    //   cv-qualifiers are introduced through the use of a typedef-name<br>
> +    //   or decltype-specifier, in which case the cv-qualifiers are ignored.<br>
> +    //<br>
> +    // There don't appear to be any other contexts in which a cv-qualified<br>
> +    // reference type could be formed, so the 'ill-formed' clause here appears<br>
> +    // to never happen.<br>
>     if (DS.getTypeSpecType() == DeclSpec::TST_typename &&<br>
>         TypeQuals && Result->isReferenceType()) {<br>
> -      TypeQuals &= ~DeclSpec::TQ_const;<br>
> -      TypeQuals &= ~DeclSpec::TQ_volatile;<br>
> -      TypeQuals &= ~DeclSpec::TQ_atomic;<br>
> +      // If this occurs outside a template instantiation, warn the user about<br>
> +      // it; they probably didn't mean to specify a redundant qualifier.<br>
> +      std::pair<DeclSpec::TQ, SourceLocation> Quals[] = {<br>
> +        { DeclSpec::TQ_const, DS.getConstSpecLoc() },<br>
> +        { DeclSpec::TQ_volatile, DS.getVolatileSpecLoc() },<br>
> +        { DeclSpec::TQ_atomic, DS.getAtomicSpecLoc() }<br>
> +      };<br>
> +      for (unsigned I = 0, N = llvm::array_lengthof(Quals); I != N; ++I) {<br>
> +        if (S.ActiveTemplateInstantiations.empty()) {<br>
> +          if (TypeQuals & Quals[I].first)<br>
> +            S.Diag(Quals[I].second, diag::warn_typecheck_reference_qualifiers)<br>
> +              << DeclSpec::getSpecifierName(Quals[I].first) << Result<br>
> +              << FixItHint::CreateRemoval(Quals[I].second);<br>
> +        }<br>
> +        TypeQuals &= ~Quals[I].first;<br>
> +      }<br>
>     }<br>
><br>
>     // C90 6.5.3 constraints: "The same type qualifier shall not appear more<br>
><br>
> Modified: cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.ref/p6-0x.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.ref/p6-0x.cpp?rev=201620&r1=201619&r2=201620&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.ref/p6-0x.cpp?rev=201620&r1=201619&r2=201620&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.ref/p6-0x.cpp (original)<br>
> +++ cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.ref/p6-0x.cpp Tue Feb 18 18:13:27 2014<br>
> @@ -1,5 +1,4 @@<br>
> // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s<br>
> -// expected-no-diagnostics<br>
><br>
> template<typename T, typename U><br>
> struct is_same {<br>
> @@ -20,8 +19,8 @@ typedef int& LRI;<br>
> typedef int&& RRI;<br>
><br>
> typedef LRI& r1; CHECK_EQUAL_TYPES(r1, int&);<br>
> -typedef const LRI& r2; CHECK_EQUAL_TYPES(r2, int&);<br>
> -typedef const LRI&& r3; CHECK_EQUAL_TYPES(r3, int&);<br>
> +typedef const LRI& r2; CHECK_EQUAL_TYPES(r2, int&); // expected-warning {{'const' qualifier on reference type 'LRI' (aka 'int &') has no effect}}<br>
> +typedef const LRI&& r3; CHECK_EQUAL_TYPES(r3, int&); // expected-warning {{'const' qualifier on reference type 'LRI' (aka 'int &') has no effect}}<br>
><br>
> typedef RRI& r4; CHECK_EQUAL_TYPES(r4, int&);<br>
> typedef RRI&& r5; CHECK_EQUAL_TYPES(r5, int&&);<br>
><br>
> Modified: cfe/trunk/test/CXX/drs/dr1xx.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr1xx.cpp?rev=201620&r1=201619&r2=201620&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr1xx.cpp?rev=201620&r1=201619&r2=201620&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CXX/drs/dr1xx.cpp (original)<br>
> +++ cfe/trunk/test/CXX/drs/dr1xx.cpp Tue Feb 18 18:13:27 2014<br>
> @@ -40,13 +40,13 @@ namespace dr102 { // dr102: yes<br>
> namespace dr106 { // dr106: sup 540<br>
>   typedef int &r1;<br>
>   typedef r1 &r1;<br>
> -  typedef const r1 r1;<br>
> -  typedef const r1 &r1;<br>
> +  typedef const r1 r1; // expected-warning {{has no effect}}<br>
> +  typedef const r1 &r1; // expected-warning {{has no effect}}<br>
><br>
>   typedef const int &r2;<br>
>   typedef r2 &r2;<br>
> -  typedef const r2 r2;<br>
> -  typedef const r2 &r2;<br>
> +  typedef const r2 r2; // expected-warning {{has no effect}}<br>
> +  typedef const r2 &r2; // expected-warning {{has no effect}}<br>
> }<br>
><br>
> namespace dr107 { // dr107: yes<br>
><br>
> Modified: cfe/trunk/test/Parser/cxx-reference.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-reference.cpp?rev=201620&r1=201619&r2=201620&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-reference.cpp?rev=201620&r1=201619&r2=201620&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Parser/cxx-reference.cpp (original)<br>
> +++ cfe/trunk/test/Parser/cxx-reference.cpp Tue Feb 18 18:13:27 2014<br>
> @@ -10,7 +10,7 @@ void foo(int &a) {<br>
><br>
> typedef int & A;<br>
><br>
> -void g(const A aref) {<br>
> +void g(const A aref) { // expected-warning {{'const' qualifier on reference type 'A' (aka 'int &') has no effect}}<br>
> }<br>
><br>
> int & const X = val; // expected-error {{'const' qualifier may not be applied to a reference}}<br>
><br>
> Modified: cfe/trunk/test/Parser/cxx0x-rvalue-reference.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-rvalue-reference.cpp?rev=201620&r1=201619&r2=201620&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-rvalue-reference.cpp?rev=201620&r1=201619&r2=201620&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Parser/cxx0x-rvalue-reference.cpp (original)<br>
> +++ cfe/trunk/test/Parser/cxx0x-rvalue-reference.cpp Tue Feb 18 18:13:27 2014<br>
> @@ -3,7 +3,7 @@<br>
> int && r1(int &&a);<br>
><br>
> typedef int && R;<br>
> -void r2(const R a) {<br>
> +void r2(const R a) { // expected-warning {{'const' qualifier on reference type 'R' (aka 'int &&') has no effect}}<br>
>   int & &&ar = a; // expected-error{{'ar' declared as a reference to a reference}}<br>
> }<br>
><br>
><br>
> Modified: cfe/trunk/test/SemaCXX/references.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/references.cpp?rev=201620&r1=201619&r2=201620&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/references.cpp?rev=201620&r1=201619&r2=201620&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/SemaCXX/references.cpp (original)<br>
> +++ cfe/trunk/test/SemaCXX/references.cpp Tue Feb 18 18:13:27 2014<br>
> @@ -85,9 +85,19 @@ void test8(int& const,// expected-error{<br>
>   typedef int& intref;<br>
>   typedef intref& intrefref; // C++ DR 106: reference collapsing<br>
><br>
> -  typedef intref const intref_c; // okay. FIXME: how do we verify that this is the same type as intref?<br>
> +  typedef intref const intref_c; // expected-warning {{'const' qualifier on reference type 'intref' (aka 'int &') has no effect}}<br>
> +  typedef intref_c intref; // ok, same type<br>
> +<br>
> +  typedef intref volatile intref; // expected-warning {{'volatile' qualifier on reference type 'intref' (aka 'int &') has no effect}}<br>
> +  typedef intref _Atomic intref; // expected-warning {{'_Atomic' qualifier on reference type 'intref' (aka 'int &') has no effect}}<br>
> +<br>
> +  void restrict_ref(__restrict intref); // ok<br>
> +  void restrict_ref(int &__restrict); // ok<br>
> }<br>
><br>
> +template<typename T> int const_param(const T) {}<br>
> +int const_ref_param = const_param<int&>(const_ref_param); // no-warning<br>
> +<br>
><br>
> class string {<br>
>   char *Data;<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>
<br>
</div></div></blockquote></div><br></div>