r196481 - Implement DR482: namespace members can be redeclared with a qualified name

Alp Toker alp at nuanti.com
Thu Dec 5 06:41:01 PST 2013


On 05/12/2013 07:51, Richard Smith wrote:
> Author: rsmith
> Date: Thu Dec  5 01:51:02 2013
> New Revision: 196481
>
> URL: http://llvm.org/viewvc/llvm-project?rev=196481&view=rev
> Log:
> Implement DR482: namespace members can be redeclared with a qualified name
> within their namespace, and such a redeclaration isn't required to be a
> definition any more.
>
> Update DR status page to say Clang 3.4 instead of SVN and add new Clang 3.5
> category (but keep Clang 3.4 yellow for now).
>
> Modified:
>      cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>      cfe/trunk/lib/Sema/SemaDecl.cpp
>      cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>      cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp
>      cfe/trunk/test/CXX/drs/dr1xx.cpp
>      cfe/trunk/test/CXX/drs/dr4xx.cpp
>      cfe/trunk/test/CXX/temp/p3.cpp
>      cfe/trunk/test/SemaCXX/nested-name-spec.cpp
>      cfe/trunk/www/cxx_dr_status.html
>      cfe/trunk/www/make_cxx_dr_status
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Dec  5 01:51:02 2013
> @@ -4458,6 +4458,9 @@ def warn_member_extra_qualification : Wa
>     "extra qualification on member %0">, InGroup<Microsoft>;
>   def err_member_extra_qualification : Error<
>     "extra qualification on member %0">;
> +def warn_namespace_member_extra_qualification : Warning<
> +  "extra qualification on member %0">,
> +  InGroup<DiagGroup<"extra-qualification">>;
>   def err_member_qualification : Error<
>     "non-friend class member %0 cannot have a qualified name">;
>   def note_member_def_close_match : Note<"member declaration nearly matches">;
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Dec  5 01:51:02 2013
> @@ -4115,33 +4115,31 @@ bool Sema::DiagnoseClassNameShadow(DeclC
>   /// \returns true if we cannot safely recover from this error, false otherwise.
>   bool Sema::diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC,
>                                           DeclarationName Name,
> -                                      SourceLocation Loc) {
> +                                        SourceLocation Loc) {
>     DeclContext *Cur = CurContext;
>     while (isa<LinkageSpecDecl>(Cur) || isa<CapturedDecl>(Cur))
>       Cur = Cur->getParent();
> -
> -  // C++ [dcl.meaning]p1:
> -  //   A declarator-id shall not be qualified except for the definition
> -  //   of a member function (9.3) or static data member (9.4) outside of
> -  //   its class, the definition or explicit instantiation of a function
> -  //   or variable member of a namespace outside of its namespace, or the
> -  //   definition of an explicit specialization outside of its namespace,
> -  //   or the declaration of a friend function that is a member of
> -  //   another class or namespace (11.3). [...]
> -
> -  // The user provided a superfluous scope specifier that refers back to the
> -  // class or namespaces in which the entity is already declared.
> +
> +  // If the user provided a superfluous scope specifier that refers back to the
> +  // class in which the entity is already declared, diagnose and ignore it.
>     //
>     // class X {
>     //   void X::f();
>     // };
> +  //
> +  // Note, it was once ill-formed to give redundant qualification in all
> +  // contexts, but that rule was removed by DR482.
>     if (Cur->Equals(DC)) {
> -    Diag(Loc, LangOpts.MicrosoftExt? diag::warn_member_extra_qualification
> -                                   : diag::err_member_extra_qualification)
> -      << Name << FixItHint::CreateRemoval(SS.getRange());
> -    SS.clear();
> +    if (Cur->isRecord()) {
> +      Diag(Loc, LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
> +                                      : diag::err_member_extra_qualification)
> +        << Name << FixItHint::CreateRemoval(SS.getRange());
> +      SS.clear();
> +    } else {
> +      Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
> +    }
>       return false;
> -  }
> +  }
>   
>     // Check whether the qualifying scope encloses the scope of the original
>     // declaration.
> @@ -7248,11 +7246,12 @@ Sema::ActOnFunctionDeclarator(Scope *S,
>           }
>         }
>   
> -    } else if (!D.isFunctionDefinition() && D.getCXXScopeSpec().isSet() &&
> +    } else if (!D.isFunctionDefinition() &&
> +               isa<CXXMethodDecl>(NewFD) && NewFD->isOutOfLine() &&
>                  !isFriend && !isFunctionTemplateSpecialization &&
>                  !isExplicitSpecialization) {
>         // An out-of-line member function declaration must also be a
> -      // definition (C++ [dcl.meaning]p1).
> +      // definition (C++ [class.mfct]p2).
>         // Note that this is not the case for explicit specializations of
>         // function templates or member functions of class templates, per
>         // C++ [temp.expl.spec]p2. We also allow these declarations as an
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Dec  5 01:51:02 2013
> @@ -12133,11 +12133,13 @@ void Sema::ActOnCXXEnterDeclInitializer(
>     // If there is no declaration, there was an error parsing it.
>     if (D == 0 || D->isInvalidDecl()) return;
>   
> -  // We should only get called for declarations with scope specifiers, like:
> -  //   int foo::bar;
> -  assert(D->isOutOfLine());
> -  EnterDeclaratorContext(S, D->getDeclContext());
> -
> +  // We will always have a nested name specifier here, but this declaration
> +  // might not be out of line if the specifier names the current namespace:
> +  //   extern int n;
> +  //   int ::n = 0;
> +  if (D->isOutOfLine())
> +    EnterDeclaratorContext(S, D->getDeclContext());
> +
>     // If we are parsing the initializer for a static data member, push a
>     // new expression evaluation context that is associated with this static
>     // data member.
> @@ -12152,10 +12154,10 @@ void Sema::ActOnCXXExitDeclInitializer(S
>     if (D == 0 || D->isInvalidDecl()) return;
>   
>     if (isStaticDataMember(D))
> -    PopExpressionEvaluationContext();
> +    PopExpressionEvaluationContext();
>   
> -  assert(D->isOutOfLine());
> -  ExitDeclaratorContext(S);
> +  if (D->isOutOfLine())
> +    ExitDeclaratorContext(S);
>   }
>   
>   /// ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a
>
> Modified: cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp (original)
> +++ cfe/trunk/test/CXX/dcl.decl/dcl.meaning/p1.cpp Thu Dec  5 01:51:02 2013
> @@ -29,9 +29,17 @@ namespace NS {
>     template<typename T> void wibble(T);
>   }
>   namespace NS {
> -  void NS::foo() {} // expected-error{{extra qualification on member 'foo'}}
> -  int NS::bar; // expected-error{{extra qualification on member 'bar'}}
> -  struct NS::X { }; // expected-error{{extra qualification on member 'X'}}
> -  template<typename T> struct NS::Y; // expected-error{{extra qualification on member 'Y'}}
> -  template<typename T> void NS::wibble(T) { } // expected-error{{extra qualification on member 'wibble'}}
> +  // Under DR482, these are all valid, except for forward-declaring a struct
> +  // with a nested-name-specifier.
> +  void NS::foo(); // expected-warning {{extra qualification}}
> +  extern int NS::bar; // expected-warning {{extra qualification}}
> +  struct NS::X; // expected-error {{forward declaration of struct cannot have a nested name specifier}} expected-warning {{extra qualification}}
> +  template<typename T> struct NS::Y; // expected-error {{forward declaration of struct cannot have a nested name specifier}} expected-warning {{extra qualification}}
> +  template<typename T> void NS::wibble(T); // expected-warning {{extra qualification}}
> +
> +  void NS::foo() {} // expected-warning{{extra qualification on member 'foo'}}
> +  int NS::bar; // expected-warning{{extra qualification on member 'bar'}}
> +  struct NS::X { }; // expected-warning{{extra qualification on member 'X'}}
> +  template<typename T> struct NS::Y { }; // expected-warning{{extra qualification on member 'Y'}}
> +  template<typename T> void NS::wibble(T) { } // expected-warning{{extra qualification on member 'wibble'}}
>   }
>
> Modified: cfe/trunk/test/CXX/drs/dr1xx.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr1xx.cpp?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/drs/dr1xx.cpp (original)
> +++ cfe/trunk/test/CXX/drs/dr1xx.cpp Thu Dec  5 01:51:02 2013
> @@ -592,11 +592,10 @@ namespace dr155 { // dr155: dup 632
>     struct S { int n; } s = { { 1 } }; // expected-warning {{braces around scalar initializer}}
>   }
>   
> -namespace dr159 { // dr159: no
> +namespace dr159 { // dr159: 3.5
>     namespace X { void f(); }
>     void f();
> -  // FIXME: This should be accepted.
> -  void dr159::f() {} // expected-error {{extra qualification}}
> +  void dr159::f() {} // expected-warning {{extra qualification}}
>     void dr159::X::f() {}
>   }
>   
>
> Modified: cfe/trunk/test/CXX/drs/dr4xx.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr4xx.cpp?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/drs/dr4xx.cpp (original)
> +++ cfe/trunk/test/CXX/drs/dr4xx.cpp Thu Dec  5 01:51:02 2013
> @@ -1,6 +1,6 @@
>   // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
>   // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
> -// expected-no-diagnostics
> +// RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
>   
>   namespace dr408 { // dr408: 3.4
>     template<int N> void g() { int arr[N != 1 ? 1 : -1]; }
> @@ -30,3 +30,37 @@ namespace dr408 { // dr408: 3.4
>     template<> int R<int>::arr[2];
>     template void R<int>::f();
>   }
> +
> +namespace dr482 { // dr482: 3.5
> +  extern int a;
> +  void f();
> +
> +  int dr482::a = 0; // expected-warning {{extra qualification}}
> +  void dr482::f() {} // expected-warning {{extra qualification}}
> +
> +  inline namespace X { // expected-error 0-1{{C++11 feature}}
> +    extern int b;
> +    void g();
> +    struct S;
> +  }
> +  int dr482::b = 0; // expected-warning {{extra qualification}}
> +  void dr482::g() {} // expected-warning {{extra qualification}}
> +  struct dr482::S {}; // expected-warning {{extra qualification}}
> +
> +  void dr482::f(); // expected-warning {{extra qualification}}
> +  void dr482::g(); // expected-warning {{extra qualification}}
> +
> +  // FIXME: The following are valid in DR482's wording, but these are bugs in
> +  // the wording which we deliberately don't implement.
> +  namespace N { typedef int type; }
> +  typedef int N::type; // expected-error {{typedef declarator cannot be qualified}}
> +  struct A {
> +    struct B;
> +    struct A::B {}; // expected-error {{extra qualification}}
> +
> +#if __cplusplus >= 201103L
> +    enum class C;
> +    enum class A::C {}; // expected-error {{extra qualification}}
> +#endif
> +  };
> +}
>
> Modified: cfe/trunk/test/CXX/temp/p3.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/p3.cpp?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/temp/p3.cpp (original)
> +++ cfe/trunk/test/CXX/temp/p3.cpp Thu Dec  5 01:51:02 2013
> @@ -8,7 +8,8 @@ template<typename T> int S<T>::a, S<T>::
>   
>   template<typename T> struct A { static A a; } A<T>::a; // expected-error {{expected ';' after struct}} \
>                                                             expected-error {{use of undeclared identifier 'T'}} \
> -                                                          expected-error{{extra qualification}}
> +                                                          expected-error {{no member named 'a'}} \
> +                                                          expected-warning {{extra qualification}}
>   
>   template<typename T> struct B { } f(); // expected-error {{expected ';' after struct}} \
>                                             expected-error {{requires a type specifier}}
>
> Modified: cfe/trunk/test/SemaCXX/nested-name-spec.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/nested-name-spec.cpp?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/nested-name-spec.cpp (original)
> +++ cfe/trunk/test/SemaCXX/nested-name-spec.cpp Thu Dec  5 01:51:02 2013
> @@ -160,7 +160,7 @@ namespace N {
>     void f();
>     // FIXME: if we move this to a separate definition of N, things break!
>   }
> -void ::global_func2(int) { } // expected-error{{extra qualification on member 'global_func2'}}
> +void ::global_func2(int) { } // expected-warning{{extra qualification on member 'global_func2'}}
>   
>   void N::f() { } // okay
>   
>
> Modified: cfe/trunk/www/cxx_dr_status.html
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_dr_status.html?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/www/cxx_dr_status.html (original)
> +++ cfe/trunk/www/cxx_dr_status.html Thu Dec  5 01:51:02 2013
> @@ -212,7 +212,7 @@
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#29">29</a></td>
>       <td>CD1</td>
>       <td>Linkage of locally declared functions</td>
> -    <td class="svn" align="center">SVN</td>
> +    <td class="svn" align="center">Clang 3.4</td>
>     </tr>
>     <tr>
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#30">30</a></td>
> @@ -523,7 +523,7 @@
>     <tr>
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#81">81</a></td>
>       <td>NAD</td>
> -    <td>Null pointers and C compatibility</td>
> +    <td>Null pointers and C compatability</td>

!

>       <td class="na" align="center">N/A</td>
>     </tr>
>     <tr>
> @@ -854,7 +854,7 @@
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#136">136</a></td>
>       <td>CD1</td>
>       <td>Default arguments and friend declarations</td>
> -    <td class="svn" align="center">SVN</td>
> +    <td class="svn" align="center">Clang 3.4</td>
>     </tr>
>     <tr>
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#137">137</a></td>
> @@ -992,7 +992,7 @@
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#159">159</a></td>
>       <td>TC1</td>
>       <td>Namespace qualification in declarators</td>
> -    <td class="none" align="center">No</td>
> +    <td class="svn" align="center">SVN</td>
>     </tr>
>     <tr>
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#160">160</a></td>
> @@ -2488,7 +2488,7 @@ of class templates</td>
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#408">408</a></td>
>       <td>CD2</td>
>       <td>sizeof applied to unknown-bound array static data member of template</td>
> -    <td class="svn" align="center">SVN</td>
> +    <td class="svn" align="center">Clang 3.4</td>
>     </tr>
>     <tr>
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#409">409</a></td>
> @@ -2932,7 +2932,7 @@ of class templates</td>
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#482">482</a></td>
>       <td>DRWP</td>
>       <td>Qualified declarators in redeclarations</td>
> -    <td class="none" align="center">Unknown</td>
> +    <td class="svn" align="center">SVN</td>
>     </tr>
>     <tr>
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#483">483</a></td>
> @@ -8159,7 +8159,7 @@ and <I>POD class</I></td>
>     <tr class="open">
>       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1391">1391</a></td>
>       <td>drafting</td>
> -    <td>Conversions to parameter types with non-deduced template arguments</td>
> +    <td>Conversions to parameter types with non deduced template arguments</td>
>       <td align="center">Not resolved</td>
>     </tr>
>     <tr>
>
> Modified: cfe/trunk/www/make_cxx_dr_status
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/www/make_cxx_dr_status?rev=196481&r1=196480&r2=196481&view=diff
> ==============================================================================
> --- cfe/trunk/www/make_cxx_dr_status (original)
> +++ cfe/trunk/www/make_cxx_dr_status Thu Dec  5 01:51:02 2013
> @@ -101,9 +101,12 @@ def availability(issue):
>     if status == 'unknown':
>       avail = 'Unknown'
>       avail_style = ' class="none"'
> -  elif status == '3.4':
> +  elif status == '3.5':
>       avail = 'SVN'
>       avail_style = ' class="svn"'
> +  elif status == '3.4':
> +    avail = 'Clang %s' % status
> +    avail_style = ' class="svn"'
>     elif status in ('3.1', '3.2', '3.3'):
>       avail = 'Clang %s' % status
>       avail_style = ' class="full"'
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-- 
http://www.nuanti.com
the browser experts




More information about the cfe-commits mailing list