Index: lib/AST/Decl.cpp =================================================================== --- lib/AST/Decl.cpp +++ lib/AST/Decl.cpp @@ -1257,8 +1257,7 @@ case Decl::TypeAlias: // A typedef declaration has linkage if it gives a type a name for // linkage purposes. - if (!D->getASTContext().getLangOpts().CPlusPlus || - !cast(D) + if (!cast(D) ->getAnonDeclWithTypedefName(/*AnyRedecl*/true)) return LinkageInfo::none(); break; Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -1996,8 +1996,7 @@ // If both declarations give a tag declaration a typedef name for linkage // purposes, then they declare the same entity. - if (S.getLangOpts().CPlusPlus && - OldTD->getAnonDeclWithTypedefName(/*AnyRedecl*/true) && + if (OldTD->getAnonDeclWithTypedefName(/*AnyRedecl*/true) && Decl->getAnonDeclWithTypedefName()) continue; } @@ -2115,7 +2114,7 @@ auto *OldTag = OldTD->getAnonDeclWithTypedefName(/*AnyRedecl*/true); auto *NewTag = New->getAnonDeclWithTypedefName(); NamedDecl *Hidden = nullptr; - if (getLangOpts().CPlusPlus && OldTag && NewTag && + if (OldTag && NewTag && OldTag->getCanonicalDecl() != NewTag->getCanonicalDecl() && !hasVisibleDefinition(OldTag, &Hidden)) { // There is a definition of this tag, but it is not visible. Use it Index: test/Modules/Inputs/merge-typedefs-c/a.h =================================================================== --- /dev/null +++ test/Modules/Inputs/merge-typedefs-c/a.h @@ -0,0 +1,4 @@ +#ifndef A_H +#define A_H +#include "textual.h" +#endif Index: test/Modules/Inputs/merge-typedefs-c/empty.h =================================================================== --- /dev/null +++ test/Modules/Inputs/merge-typedefs-c/empty.h @@ -0,0 +1 @@ +// This is a module trigger. Index: test/Modules/Inputs/merge-typedefs-c/module.modulemap =================================================================== --- /dev/null +++ test/Modules/Inputs/merge-typedefs-c/module.modulemap @@ -0,0 +1,11 @@ +module "A" { + export * + module "a.h" { + export * + header "a.h" + } + module "empty.h" { + export * + header "empty.h" + } + } Index: test/Modules/Inputs/merge-typedefs-c/textual.h =================================================================== --- /dev/null +++ test/Modules/Inputs/merge-typedefs-c/textual.h @@ -0,0 +1,7 @@ +#ifndef TEXTUAL_H +#define TEXTUAL_H + +typedef struct { } __fsid_t; + +#endif + Index: test/Modules/merge-typedefs-c.c =================================================================== --- /dev/null +++ test/Modules/merge-typedefs-c.c @@ -0,0 +1,10 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -xc -fmodules-cache-path=%t -I%S/Inputs/merge-typedefs-c/ -fimplicit-module-maps -verify %s +// RUN: %clang_cc1 -fmodules -xc++ -fmodules-cache-path=%t -I%S/Inputs/merge-typedefs-c/ -fimplicit-module-maps -verify %s + +// expected-no-diagnostics +#include "empty.h" +#include "textual.h" +#include "a.h" + +__fsid_t use;