summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-07-14 02:01:48 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-07-14 02:01:48 +0000
commit42713d763f052def9d0b525da9530ac97333752c (patch)
tree87d36bbb63a906ba00ef99bfb9db03649cb76244
parenta76289aa1bfde6abec629a94dc3d1d6e192e9d6f (diff)
downloadbcm5719-llvm-42713d763f052def9d0b525da9530ac97333752c.tar.gz
bcm5719-llvm-42713d763f052def9d0b525da9530ac97333752c.zip
If an unimported submodule of an imported module contains a declaration of a
global allocation or deallocation function, that should not cause that global allocation or deallocation function to become unavailable. llvm-svn: 186270
-rw-r--r--clang/include/clang/AST/Decl.h7
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp6
-rw-r--r--clang/test/Modules/Inputs/cxx-decls-imported.h0
-rw-r--r--clang/test/Modules/Inputs/cxx-decls-unimported.h1
-rw-r--r--clang/test/Modules/Inputs/module.map9
-rw-r--r--clang/test/Modules/cxx-decls.cpp12
6 files changed, 32 insertions, 3 deletions
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index c849b5417b6..bc588ac4542 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -189,10 +189,13 @@ public:
using Decl::isModulePrivate;
using Decl::setModulePrivate;
-
+
/// \brief Determine whether this declaration is hidden from name lookup.
bool isHidden() const { return Hidden; }
-
+
+ /// \brief Set whether this declaration is hidden from name lookup.
+ void setHidden(bool Hide) { Hidden = Hide; }
+
/// \brief Determine whether this declaration is a C++ class member.
bool isCXXClassMember() const {
const DeclContext *DC = getDeclContext();
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index a6b6e36bb7d..39c42118922 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -1949,8 +1949,12 @@ void Sema::DeclareGlobalAllocationFunction(DeclarationName Name,
Func->getParamDecl(0)->getType().getUnqualifiedType());
// FIXME: Do we need to check for default arguments here?
if (Func->getNumParams() == 1 && InitialParamType == Argument) {
- if(AddMallocAttr && !Func->hasAttr<MallocAttr>())
+ if (AddMallocAttr && !Func->hasAttr<MallocAttr>())
Func->addAttr(::new (Context) MallocAttr(SourceLocation(), Context));
+ // Make the function visible to name lookup, even if we found it in an
+ // unimported module. It either is an implicitly-declared global
+ // allocation function, or is suppressing that function.
+ Func->setHidden(false);
return;
}
}
diff --git a/clang/test/Modules/Inputs/cxx-decls-imported.h b/clang/test/Modules/Inputs/cxx-decls-imported.h
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/clang/test/Modules/Inputs/cxx-decls-imported.h
diff --git a/clang/test/Modules/Inputs/cxx-decls-unimported.h b/clang/test/Modules/Inputs/cxx-decls-unimported.h
new file mode 100644
index 00000000000..0431e324616
--- /dev/null
+++ b/clang/test/Modules/Inputs/cxx-decls-unimported.h
@@ -0,0 +1 @@
+void operator delete(void*);
diff --git a/clang/test/Modules/Inputs/module.map b/clang/test/Modules/Inputs/module.map
index a4ac5b14de3..0a84f88b0af 100644
--- a/clang/test/Modules/Inputs/module.map
+++ b/clang/test/Modules/Inputs/module.map
@@ -200,6 +200,15 @@ module cxx_templates_b {
header "cxx-templates-b.h"
}
+module cxx_decls {
+ module unimported {
+ header "cxx-decls-unimported.h"
+ }
+ module imported {
+ header "cxx-decls-imported.h"
+ }
+}
+
module config {
header "config.h"
config_macros [exhaustive] WANT_FOO, WANT_BAR
diff --git a/clang/test/Modules/cxx-decls.cpp b/clang/test/Modules/cxx-decls.cpp
new file mode 100644
index 00000000000..733e3f90bc7
--- /dev/null
+++ b/clang/test/Modules/cxx-decls.cpp
@@ -0,0 +1,12 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodules-cache-path=%t -I %S/Inputs %s -verify -std=c++11
+
+// expected-no-diagnostics
+
+@import cxx_decls.imported;
+
+void test_delete(int *p) {
+ // We can call the normal global deallocation function even though it has only
+ // ever been explicitly declared in an unimported submodule.
+ delete p;
+}
OpenPOWER on IntegriCloud