[PATCH] D13925: Implement __attribute__((internal_linkage))

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 2 13:53:00 PST 2015


rsmith added inline comments.

================
Comment at: include/clang/Basic/Attr.td:2125
@@ +2124,3 @@
+
+def InternalLinkage : InheritableAttr {
+  let Spellings = [GNU<"internal_linkage">, CXX11<"clang", "internal_linkage">];
----------------
`InheritableAttr` doesn't seem right for the case when this is applied to a namespace.

================
Comment at: lib/AST/Decl.cpp:1358-1362
@@ -1346,3 +1357,7 @@
     }
-    assert(!Old || Old->getCachedLinkage() == D->getCachedLinkage());
+    // Linkages may also differ if one of the declarations has
+    // InternalLinkageAttr.
+    assert(!Old || Old->getCachedLinkage() == D->getCachedLinkage() ||
+           (Old->hasAttr<InternalLinkageAttr>() !=
+            D->hasAttr<InternalLinkageAttr>()));
 #endif
----------------
We shouldn't allow the linkage to be changed after the first declaration. What cases cause problems here?

================
Comment at: lib/Sema/Sema.cpp:539
@@ -538,3 +538,3 @@
 
-    if (!ND->isExternallyVisible()) {
+    if (!ND->isExternallyVisible() || ND->hasAttr<InternalLinkageAttr>()) {
       S.Diag(ND->getLocation(), diag::warn_undefined_internal)
----------------
Hmm, what should `isExternallyVisible` return for a declaration with this attribute? Presumably it should be `false`...


Repository:
  rL LLVM

http://reviews.llvm.org/D13925





More information about the cfe-commits mailing list