diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-07-07 23:08:52 +0000 | 
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-07-07 23:08:52 +0000 | 
| commit | 1d9ef840fa7b627348774b37a2f07709ab33b76b (patch) | |
| tree | 0e40a6f52b22bae18f2e1ca4497fc4a311310882 /clang/lib/Sema/SemaDeclCXX.cpp | |
| parent | 6213ab789fd029c0c7aecc9057692b049f89736e (diff) | |
| download | bcm5719-llvm-1d9ef840fa7b627348774b37a2f07709ab33b76b.tar.gz bcm5719-llvm-1d9ef840fa7b627348774b37a2f07709ab33b76b.zip | |
A using declaration can redeclare a typedef to the same type. These
typedefs won't have the same canonical declaration (since they are
distinct), so we need to check for this case specifically. Fixes
<rdar://problem/8018262>.
llvm-svn: 107833
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 27 | 
1 files changed, 25 insertions, 2 deletions
| diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index df1143c5c90..bd97df2ce9d 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3496,6 +3496,28 @@ Sema::DeclPtrTy Sema::ActOnUsingDeclaration(Scope *S,    return DeclPtrTy::make(UD);  } +/// \brief Determine whether a using declaration considers the given +/// declarations as "equivalent", e.g., if they are redeclarations of +/// the same entity or are both typedefs of the same type. +static bool  +IsEquivalentForUsingDecl(ASTContext &Context, NamedDecl *D1, NamedDecl *D2, +                         bool &SuppressRedeclaration) { +  if (D1->getCanonicalDecl() == D2->getCanonicalDecl()) { +    SuppressRedeclaration = false; +    return true; +  } + +  if (TypedefDecl *TD1 = dyn_cast<TypedefDecl>(D1)) +    if (TypedefDecl *TD2 = dyn_cast<TypedefDecl>(D2)) { +      SuppressRedeclaration = true; +      return Context.hasSameType(TD1->getUnderlyingType(), +                                 TD2->getUnderlyingType()); +    } + +  return false; +} + +  /// Determines whether to create a using shadow decl for a particular  /// decl, given the set of decls existing prior to this using lookup.  bool Sema::CheckUsingShadowDecl(UsingDecl *Using, NamedDecl *Orig, @@ -3562,8 +3584,9 @@ bool Sema::CheckUsingShadowDecl(UsingDecl *Using, NamedDecl *Orig,    for (LookupResult::iterator I = Previous.begin(), E = Previous.end();           I != E; ++I) {      NamedDecl *D = (*I)->getUnderlyingDecl(); -    if (D->getCanonicalDecl() == Target->getCanonicalDecl()) -      return false; +    bool Result; +    if (IsEquivalentForUsingDecl(Context, D, Target, Result)) +      return Result;      (isa<TagDecl>(D) ? Tag : NonTag) = D;    } | 

