r255267 - [Modules] Fix regression when an elaborated-type-specifier mentions a hidden tag

Ben Langmuir via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 10 09:28:52 PST 2015


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
+
+ at 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 at elaborated-type-structs.h:* 2 {{previous definition is here}}
+
+ at import ElaboratedTypeStructs.Structs;
+
+void useS1(struct S1 *x);
+void useS2(struct S2 *x);
+void useS2(struct S2 *x);




More information about the cfe-commits mailing list