aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAxel Naumann <Axel.Naumann@cern.ch>2012-10-01 09:51:27 +0000
committerAxel Naumann <Axel.Naumann@cern.ch>2012-10-01 09:51:27 +0000
commit3dd82f7f01a9ba995bea3027a934df85850cab58 (patch)
tree5369cc7bd5b365181712036ef5dcdb72e706e971
parentb0e33d499d97b69f795cb53f8934bcd134a56b5a (diff)
The Redeclarable part of named decls is read before their name.
Lookup can nevertheless find them due to the serialized lookup table. For instance when reading a template decl's templatedDecl, it will search for existing decls that it could be a redeclaration of, and find the half-read template decl. Thus there is no point in asserting the names of decls. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164932 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Serialization/ASTReader.cpp6
-rw-r--r--test/Modules/Inputs/redecl-merge-left.h12
2 files changed, 11 insertions, 7 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp
index 17296685c4..639ef93fb6 100644
--- a/lib/Serialization/ASTReader.cpp
+++ b/lib/Serialization/ASTReader.cpp
@@ -4950,8 +4950,10 @@ namespace {
continue;
if (ND->getDeclName() != This->Name) {
- assert(!This->Name.getCXXNameType().isNull() &&
- "Name mismatch without a type");
+ // A name might be null because the decl's redeclarable part is
+ // currently read before reading its name. The lookup is triggered by
+ // building that decl (likely indirectly), and so it is later in the
+ // sense of "already existing" and can be ignored here.
continue;
}
diff --git a/test/Modules/Inputs/redecl-merge-left.h b/test/Modules/Inputs/redecl-merge-left.h
index a6ea6024c8..1f5da4f2e2 100644
--- a/test/Modules/Inputs/redecl-merge-left.h
+++ b/test/Modules/Inputs/redecl-merge-left.h
@@ -88,12 +88,14 @@ template<> class List<bool> {
public:
void push_back(int);
};
-
namespace N {
-template<typename T> class Set {
-public:
- void insert(T);
-};
+ template<typename T> class Set;
+}
+namespace N {
+ template<typename T> class Set {
+ public:
+ void insert(T);
+ };
}
#endif