diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-11-04 08:48:52 +0000 | 
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-11-04 08:48:52 +0000 | 
| commit | 4b52007c35d28d321e1e1b1d6df09d9df5558788 (patch) | |
| tree | aec36e12d8be72df1a42ea946f5cf6e3a7ceb5e8 /clang | |
| parent | ba37e1eb49c41689bbf0478fb44e66183203dd13 (diff) | |
| download | bcm5719-llvm-4b52007c35d28d321e1e1b1d6df09d9df5558788.tar.gz bcm5719-llvm-4b52007c35d28d321e1e1b1d6df09d9df5558788.zip  | |
Don't be so eager to replace UsingDecls in a DeclContext's lookup table;
check that the TargetNestedNameDecl is the same first.
llvm-svn: 118239
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 4 | ||||
| -rw-r--r-- | clang/test/SemaCXX/using-decl-templates.cpp | 18 | 
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index ca963ad7e59..c6c7649bdac 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -732,6 +732,10 @@ bool NamedDecl::declarationReplaces(NamedDecl *OldD) const {      return cast<UsingShadowDecl>(this)->getTargetDecl() ==             cast<UsingShadowDecl>(OldD)->getTargetDecl(); +  if (isa<UsingDecl>(this) && isa<UsingDecl>(OldD)) +    return cast<UsingDecl>(this)->getTargetNestedNameDecl() == +           cast<UsingDecl>(OldD)->getTargetNestedNameDecl(); +    // For non-function declarations, if the declarations are of the    // same kind then this must be a redeclaration, or semantic analysis    // would not have given us the new declaration. diff --git a/clang/test/SemaCXX/using-decl-templates.cpp b/clang/test/SemaCXX/using-decl-templates.cpp index 5148ed5bcc7..7b4da9d50d0 100644 --- a/clang/test/SemaCXX/using-decl-templates.cpp +++ b/clang/test/SemaCXX/using-decl-templates.cpp @@ -45,3 +45,21 @@ namespace test0 {    template struct E<int>;  } + +// PR7896 +namespace PR7896 { +template <class T> struct Foo { +  int k (float); +}; +struct Baz { +  int k (int); +}; +template <class T> struct Bar : public Foo<T>, Baz { +  using Foo<T>::k; +  using Baz::k; +  int foo() { +    return k (1.0f); +  } +}; +template int Bar<int>::foo(); +}  | 

