diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-01-13 23:49:34 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-01-13 23:49:34 +0000 |
commit | 87ea58f5cdff650fdb5be3f5d02a531fe4c9302b (patch) | |
tree | e5f238e56bb81657ec39154f4913cdee40a8b976 /clang | |
parent | c09e0557a548a3032c9de7915e9f10426efd9d70 (diff) | |
download | bcm5719-llvm-87ea58f5cdff650fdb5be3f5d02a531fe4c9302b.tar.gz bcm5719-llvm-87ea58f5cdff650fdb5be3f5d02a531fe4c9302b.zip |
(Implicit) parameters deserialized as part of a function type must not
get added to the identifier chains as part of deserialization, because
they should not be visible to name lookup.
llvm-svn: 148159
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 6 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/redecl-merge-left.h | 5 | ||||
-rw-r--r-- | clang/test/Modules/redecl-merge.m | 3 |
3 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 6b8a72f807f..75c079fb65b 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -879,8 +879,10 @@ void ASTDeclReader::VisitVarDecl(VarDecl *VD) { VD->VarDeclBits.NRVOVariable = Record[Idx++]; VD->VarDeclBits.CXXForRangeDecl = Record[Idx++]; VD->VarDeclBits.ARCPseudoStrong = Record[Idx++]; - - mergeRedeclarable(VD, Redecl); + + // Only true variables (not parameters or implicit parameters) can be merged. + if (VD->getKind() == Decl::Var) + mergeRedeclarable(VD, Redecl); if (uint64_t Val = Record[Idx++]) { VD->setInit(Reader.ReadExpr(F)); diff --git a/clang/test/Modules/Inputs/redecl-merge-left.h b/clang/test/Modules/Inputs/redecl-merge-left.h index 632125ddb11..798aa83b503 100644 --- a/clang/test/Modules/Inputs/redecl-merge-left.h +++ b/clang/test/Modules/Inputs/redecl-merge-left.h @@ -83,3 +83,8 @@ template<typename T> class Vector; template<typename T> class Vector; #endif + +// Make sure this doesn't introduce an ambiguity-creating 'id' at the +// top level. +typedef void funcptr_with_id(int id); + diff --git a/clang/test/Modules/redecl-merge.m b/clang/test/Modules/redecl-merge.m index e6de22a85aa..cb44a13d184 100644 --- a/clang/test/Modules/redecl-merge.m +++ b/clang/test/Modules/redecl-merge.m @@ -146,3 +146,6 @@ void testVector() { } #endif +// Make sure we don't get conflicts with 'id'. +funcptr_with_id fid; +id id_global; |