Allow redeclaration of typedefs in C++

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59822 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 7408507..0b05177 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -344,7 +344,14 @@
   
   if (getLangOptions().Microsoft) return New;
 
-  // Redeclaration of a type is a constraint violation (6.7.2.3p1).
+  // C++ [dcl.typedef]p2:
+  //   In a given non-class scope, a typedef specifier can be used to
+  //   redefine the name of any type declared in that scope to refer
+  //   to the type to which it already refers.
+  if (getLangOptions().CPlusPlus && !isa<CXXRecordDecl>(CurContext))
+    return New;
+
+  // In C, redeclaration of a type is a constraint violation (6.7.2.3p1).
   // Apparently GCC, Intel, and Sun all silently ignore the redeclaration if
   // *either* declaration is in a system header. The code below implements
   // this adhoc compatibility rule. FIXME: The following code will not