[cfe-commits] r155187 - in /cfe/trunk: lib/Sema/SemaTemplate.cpp test/SemaTemplate/class-template-decl.cpp test/SemaTemplate/friend-template.cpp

David Dean david_dean at apple.com
Fri Apr 20 09:09:07 PDT 2012


One of the dejagnu tests is now failing because clang is no longer reporting any errors.

The expected output is:
$clang g++.dg/lookup/crash6.C
g++.dg/lookup/crash6.C:8:22: error: redefinition of 'A' as different kind of symbol
template<int> struct A; // { dg-error "different kind of symbol" }
                     ^
g++.dg/lookup/crash6.C:7:5: note: previous definition is here
int A;                  // { dg-error "previous declaration" }
    ^
1 error generated.

Can you take a look?


On 20 Apr 2012, at 12:12 AM, Richard Smith wrote:

> Author: rsmith
> Date: Fri Apr 20 02:12:26 2012
> New Revision: 155187
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=155187&view=rev
> Log:
> Replace r155185 with a better fix, which also addresses PR12557. When looking
> up an elaborated type specifier in a friend declaration, only look for type
> declarations, per [basic.lookup.elab]p2. If we know that the redeclaration
> lookup for a friend class template in a dependent context finds a non-template,
> don't delay the diagnostic to instantiation time.
> 
> Modified:
>    cfe/trunk/lib/Sema/SemaTemplate.cpp
>    cfe/trunk/test/SemaTemplate/class-template-decl.cpp
>    cfe/trunk/test/SemaTemplate/friend-template.cpp
> 
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=155187&r1=155186&r2=155187&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Fri Apr 20 02:12:26 2012
> @@ -867,7 +867,7 @@
> 
>   // Find any previous declaration with this name.
>   DeclContext *SemanticContext;
> -  LookupResult Previous(*this, Name, NameLoc, LookupOrdinaryName,
> +  LookupResult Previous(*this, Name, NameLoc, LookupTagName,
>                         ForRedeclaration);
>   if (SS.isNotEmpty() && !SS.isInvalid()) {
>     SemanticContext = computeDeclContext(SS, true);
> @@ -938,7 +938,7 @@
>       while (!OutermostContext->isFileContext())
>         OutermostContext = OutermostContext->getLookupParent();
> 
> -      if (PrevClassTemplate &&
> +      if (PrevDecl &&
>           (OutermostContext->Equals(PrevDecl->getDeclContext()) ||
>            OutermostContext->Encloses(PrevDecl->getDeclContext()))) {
>         SemanticContext = PrevDecl->getDeclContext();
> @@ -951,7 +951,7 @@
>       }
>     }
> 
> -    if (CurContext->isDependentContext()) {
> +    if (CurContext->isDependentContext() && PrevClassTemplate) {
>       // If this is a dependent context, we don't want to link the friend
>       // class template to the template in scope, because that would perform
>       // checking of the template parameter lists that can't be performed
> 
> Modified: cfe/trunk/test/SemaTemplate/class-template-decl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/class-template-decl.cpp?rev=155187&r1=155186&r2=155187&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/class-template-decl.cpp (original)
> +++ cfe/trunk/test/SemaTemplate/class-template-decl.cpp Fri Apr 20 02:12:26 2012
> @@ -94,13 +94,3 @@
>     };
>   };
> }
> -
> -namespace Redecl {
> -  struct S {
> -    int packaged_task;
> -    template<typename> class future {
> -      template<typename> friend class packaged_task;
> -    };
> -    future<void> share;
> -  };
> -}
> 
> Modified: cfe/trunk/test/SemaTemplate/friend-template.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/friend-template.cpp?rev=155187&r1=155186&r2=155187&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/friend-template.cpp (original)
> +++ cfe/trunk/test/SemaTemplate/friend-template.cpp Fri Apr 20 02:12:26 2012
> @@ -243,3 +243,27 @@
> 
>   A<double>::B<double>  ab;
> }
> +
> +namespace RedeclUnrelated {
> +  struct S {
> +    int packaged_task;
> +    template<typename> class future {
> +      template<typename> friend class packaged_task;
> +    };
> +    future<void> share;
> +  };
> +}
> +
> +namespace PR12557 {
> +  template <typename>
> +  struct Foo;
> +
> +  template <typename Foo_>
> +  struct Bar {
> +    typedef Foo_  Foo; // expected-note {{previous}}
> +
> +    template <typename> friend struct Foo; // expected-error {{redefinition of 'Foo' as different kind of symbol}}
> +  };
> +
> +  Bar<int> b;
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-David





More information about the cfe-commits mailing list