[clang] c375635 - Ensure that we don't compute linkage for an anonymous class too early if

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 28 17:23:14 PDT 2020


Author: Richard Smith
Date: 2020-09-28T17:22:40-07:00
New Revision: c375635d05f6f10c7c95ecc74a0569213d176d8e

URL: https://github.com/llvm/llvm-project/commit/c375635d05f6f10c7c95ecc74a0569213d176d8e
DIFF: https://github.com/llvm/llvm-project/commit/c375635d05f6f10c7c95ecc74a0569213d176d8e.diff

LOG: Ensure that we don't compute linkage for an anonymous class too early if
it has a member whose name is the same as a builtin.

Fixes a regression from the introduction of BuiltinAttr.

Added: 
    

Modified: 
    clang/lib/Sema/SemaDecl.cpp
    clang/test/SemaCXX/anonymous-struct.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 2599e3b46e4e..aff49b7ddb90 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -9644,7 +9644,8 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
 
   // In C builtins get merged with implicitly lazily created declarations.
   // In C++ we need to check if it's a builtin and add the BuiltinAttr here.
-  if (getLangOpts().CPlusPlus) {
+  if (getLangOpts().CPlusPlus &&
+      NewFD->getDeclContext()->getRedeclContext()->isFileContext()) {
     if (IdentifierInfo *II = Previous.getLookupName().getAsIdentifierInfo()) {
       if (unsigned BuiltinID = II->getBuiltinID()) {
         if (NewFD->getLanguageLinkage() == CLanguageLinkage) {

diff  --git a/clang/test/SemaCXX/anonymous-struct.cpp b/clang/test/SemaCXX/anonymous-struct.cpp
index 333b8f724f4e..f85b00bc8bce 100644
--- a/clang/test/SemaCXX/anonymous-struct.cpp
+++ b/clang/test/SemaCXX/anonymous-struct.cpp
@@ -171,3 +171,12 @@ union {
     } x;
   } x;
 } static_member_3;
+
+// Ensure we don't compute the linkage of a member function just because it
+// happens to have the same name as a builtin.
+namespace BuiltinName {
+  // Note that this is not an error: we didn't trigger linkage computation in this example.
+  typedef struct { // expected-warning {{anonymous non-C-compatible type}}
+    void memcpy(); // expected-note {{due to this member}}
+  } A; // expected-note {{given name 'A' for linkage purposes by this typedef}}
+}


        


More information about the cfe-commits mailing list