Author: benlangmuir Date: Thu Dec 10 11:28:51 2015 New Revision: 255267 URL: http://llvm.org/viewvc/llvm-project?rev=255267&view=rev Log: [Modules] Fix regression when an elaborated-type-specifier mentions a hidden tag
This makes non-C++ languages find the same decl as C++ does to workaround a regression introduced in r252960. rdar://problem/23784203 Added: cfe/trunk/test/Modules/Inputs/elaborated-type-structs.h cfe/trunk/test/Modules/elaborated-type-specifier-from-hidden-module.m Modified: cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/Modules/Inputs/module.map Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=255267&r1=255266&r2=255267&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Dec 10 11:28:51 2015 @@ -12121,10 +12121,12 @@ Decl *Sema::ActOnTag(Scope *S, unsigned // In C++, we need to do a redeclaration lookup to properly // diagnose some problems. - if (getLangOpts().CPlusPlus) { - Previous.setRedeclarationKind(ForRedeclaration); - LookupQualifiedName(Previous, SearchDC); - } + // FIXME: this lookup is also used (with and without C++) to find a hidden + // declaration so that we don't get ambiguity errors when using a type + // declared by an elaborated-type-specifier. In C that is not correct and + // we should instead merge compatible types found by lookup. + Previous.setRedeclarationKind(ForRedeclaration); + LookupQualifiedName(Previous, SearchDC); } // If we have a known previous declaration to use, then use it. Added: cfe/trunk/test/Modules/Inputs/elaborated-type-structs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/elaborated-type-structs.h?rev=255267&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/elaborated-type-structs.h (added) +++ cfe/trunk/test/Modules/Inputs/elaborated-type-structs.h Thu Dec 10 11:28:51 2015 @@ -0,0 +1,3 @@ +struct S1; +struct S2 { int x; }; +struct S3 { int x; }; Modified: cfe/trunk/test/Modules/Inputs/module.map URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=255267&r1=255266&r2=255267&view=diff ============================================================================== --- cfe/trunk/test/Modules/Inputs/module.map (original) +++ cfe/trunk/test/Modules/Inputs/module.map Thu Dec 10 11:28:51 2015 @@ -386,3 +386,10 @@ module TypedefTag { header "typedef-tag-hidden.h" } } + +module ElaboratedTypeStructs { + module Empty {} + module Structs { + header "elaborated-type-structs.h" + } +} Added: cfe/trunk/test/Modules/elaborated-type-specifier-from-hidden-module.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/elaborated-type-specifier-from-hidden-module.m?rev=255267&view=auto ============================================================================== --- cfe/trunk/test/Modules/elaborated-type-specifier-from-hidden-module.m (added) +++ cfe/trunk/test/Modules/elaborated-type-specifier-from-hidden-module.m Thu Dec 10 11:28:51 2015 @@ -0,0 +1,18 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs %s -verify + +@import ElaboratedTypeStructs.Empty; // The structs are now hidden. +struct S1 *x; +struct S2 *y; +// FIXME: compatible definition should not be an error. +struct S2 { int x; }; // expected-error {{redefinition}} +struct S3 *z; +// Incompatible definition. +struct S3 { float y; }; // expected-error {{redefinition}} +// expected-note@elaborated-type-structs.h:* 2 {{previous definition is here}} + +@import ElaboratedTypeStructs.Structs; + +void useS1(struct S1 *x); +void useS2(struct S2 *x); +void useS2(struct S2 *x); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits