r331232 - [Modules] Handle ObjC/C ODR-like semantics for EnumConstantDecl

Bruno Cardoso Lopes via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 30 15:14:29 PDT 2018


Author: bruno
Date: Mon Apr 30 15:14:29 2018
New Revision: 331232

URL: http://llvm.org/viewvc/llvm-project?rev=331232&view=rev
Log:
[Modules] Handle ObjC/C ODR-like semantics for EnumConstantDecl

Support for ObjC/C ODR-like semantics with structural equivalence
checking was added back in r306918. There enums are handled and also
checked for structural equivalence. However, at use time of
EnumConstantDecl, support was missing for preventing ambiguous
name lookup.

Add the missing bits for properly merging EnumConstantDecl.

rdar://problem/38374569

Added:
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a.h
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a0.h
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Modules/
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Modules/module.modulemap
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/B.framework/
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/B.framework/Headers/
    cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/B.framework/Headers/b.h
    cfe/trunk/test/Modules/non-ambiguous-enum.m
Modified:
    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp

Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=331232&r1=331231&r2=331232&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Mon Apr 30 15:14:29 2018
@@ -2547,6 +2547,20 @@ void ASTDeclReader::mergeRedeclarable(Re
   }
 }
 
+/// ODR-like semantics for C/ObjC allow us to merge tag types and a structural
+/// check in Sema guarantees the types can be merged (see C11 6.2.7/1 or C89
+/// 6.1.2.6/1). Although most merging is done in Sema, we need to guarantee
+/// that some types are mergeable during deserialization, otherwise name
+/// lookup fails. This is the case for EnumConstantDecl.
+bool allowODRLikeMergeInC(NamedDecl *ND) {
+  if (!ND)
+    return false;
+  // TODO: implement merge for other necessary decls.
+  if (dyn_cast<EnumConstantDecl>(ND))
+    return true;
+  return false;
+}
+
 /// \brief Attempts to merge the given declaration (D) with another declaration
 /// of the same entity, for the case where the entity is not actually
 /// redeclarable. This happens, for instance, when merging the fields of
@@ -2557,10 +2571,12 @@ void ASTDeclReader::mergeMergeable(Merge
   if (!Reader.getContext().getLangOpts().Modules)
     return;
 
-  // ODR-based merging is only performed in C++. In C, identically-named things
-  // in different translation units are not redeclarations (but may still have
-  // compatible types).
-  if (!Reader.getContext().getLangOpts().CPlusPlus)
+  // ODR-based merging is performed in C++ and in some cases (tag types) in C.
+  // Note that C identically-named things in different translation units are
+  // not redeclarations, but may still have compatible types, where ODR-like
+  // semantics may apply.
+  if (!Reader.getContext().getLangOpts().CPlusPlus &&
+      !allowODRLikeMergeInC(dyn_cast<NamedDecl>(static_cast<T*>(D))))
     return;
 
   if (FindExistingResult ExistingRes = findExisting(static_cast<T*>(D)))

Added: cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a.h?rev=331232&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a.h (added)
+++ cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a.h Mon Apr 30 15:14:29 2018
@@ -0,0 +1 @@
+#include <A/a0.h>

Added: cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a0.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a0.h?rev=331232&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a0.h (added)
+++ cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Headers/a0.h Mon Apr 30 15:14:29 2018
@@ -0,0 +1 @@
+#include <B/b.h>

Added: cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Modules/module.modulemap
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Modules/module.modulemap?rev=331232&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Modules/module.modulemap (added)
+++ cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/A.framework/Modules/module.modulemap Mon Apr 30 15:14:29 2018
@@ -0,0 +1,6 @@
+
+framework module A {
+  header "a.h"
+  //module * { export * }
+  export *
+}

Added: cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/B.framework/Headers/b.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/B.framework/Headers/b.h?rev=331232&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/B.framework/Headers/b.h (added)
+++ cfe/trunk/test/Modules/Inputs/non-ambiguous-enum/B.framework/Headers/b.h Mon Apr 30 15:14:29 2018
@@ -0,0 +1,6 @@
+typedef long NSInteger;
+typedef enum __attribute__((flag_enum,enum_extensibility(open))) MyObjCEnum : NSInteger MyObjCEnum;
+
+enum MyObjCEnum : NSInteger {
+    MyEnumCst = 1,
+} __attribute__((availability(ios,introduced=11.0))) __attribute__((availability(tvos,unavailable))) ;

Added: cfe/trunk/test/Modules/non-ambiguous-enum.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/non-ambiguous-enum.m?rev=331232&view=auto
==============================================================================
--- cfe/trunk/test/Modules/non-ambiguous-enum.m (added)
+++ cfe/trunk/test/Modules/non-ambiguous-enum.m Mon Apr 30 15:14:29 2018
@@ -0,0 +1,10 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -F%S/Inputs/non-ambiguous-enum -fsyntax-only %s -verify
+#import <B/B.h>
+#import <A/A.h>
+
+// expected-no-diagnostics
+
+int foo() {
+  return MyEnumCst;
+}




More information about the cfe-commits mailing list