aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r--lib/Sema/SemaDecl.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 1d6b659e65..cfd33f6123 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -358,6 +358,7 @@ NamespaceDecl *Sema::GetStdNamespace() {
/// situation, merging decls or emitting diagnostics as appropriate.
///
TypedefDecl *Sema::MergeTypeDefDecl(TypedefDecl *New, Decl *OldD) {
+ bool objc_types = false;
// Allow multiple definitions for ObjC built-in typedefs.
// FIXME: Verify the underlying types are equivalent!
if (getLangOptions().ObjC1) {
@@ -368,21 +369,25 @@ TypedefDecl *Sema::MergeTypeDefDecl(TypedefDecl *New, Decl *OldD) {
if (!TypeID->isStr("id"))
break;
Context.setObjCIdType(New);
- return New;
+ objc_types = true;
+ break;
case 5:
if (!TypeID->isStr("Class"))
break;
Context.setObjCClassType(New);
+ objc_types = true;
return New;
case 3:
if (!TypeID->isStr("SEL"))
break;
Context.setObjCSelType(New);
+ objc_types = true;
return New;
case 8:
if (!TypeID->isStr("Protocol"))
break;
Context.setObjCProtoType(New->getUnderlyingType());
+ objc_types = true;
return New;
}
// Fall through - the typedef name was not a builtin type.
@@ -392,7 +397,8 @@ TypedefDecl *Sema::MergeTypeDefDecl(TypedefDecl *New, Decl *OldD) {
if (!Old) {
Diag(New->getLocation(), diag::err_redefinition_different_kind)
<< New->getDeclName();
- Diag(OldD->getLocation(), diag::note_previous_definition);
+ if (!objc_types)
+ Diag(OldD->getLocation(), diag::note_previous_definition);
return New;
}
@@ -403,10 +409,11 @@ TypedefDecl *Sema::MergeTypeDefDecl(TypedefDecl *New, Decl *OldD) {
Context.getCanonicalType(New->getUnderlyingType())) {
Diag(New->getLocation(), diag::err_redefinition_different_typedef)
<< New->getUnderlyingType() << Old->getUnderlyingType();
- Diag(Old->getLocation(), diag::note_previous_definition);
+ if (!objc_types)
+ Diag(Old->getLocation(), diag::note_previous_definition);
return New;
}
-
+ if (objc_types) return New;
if (getLangOptions().Microsoft) return New;
// C++ [dcl.typedef]p2: