summaryrefslogtreecommitdiffstats
path: root/clang/test/Modules
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2017-05-17 00:24:14 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2017-05-17 00:24:14 +0000
commit26342f915bd615900c652afd3c807a4fc195ac9f (patch)
tree1893d297ea1cf44fa0484cc6481b9a5d75da1667 /clang/test/Modules
parent9c99faa8563c11895b44d8e59c1a96216dfb17f7 (diff)
downloadbcm5719-llvm-26342f915bd615900c652afd3c807a4fc195ac9f.tar.gz
bcm5719-llvm-26342f915bd615900c652afd3c807a4fc195ac9f.zip
[modules] When creating a declaration, cache its owning module immediately
rather than waiting until it's queried. Currently this is only applied to local submodule visibility mode, as we don't yet allocate storage for the owning module in non-local-visibility modules compilations. This reinstates r302965, reverted in r303037, with a fix for the reported crash, which occurred when reparenting a local declaration to be a child of a hidden imported declaration (specifically during template instantiation). llvm-svn: 303224
Diffstat (limited to 'clang/test/Modules')
-rw-r--r--clang/test/Modules/Inputs/submodule-visibility/b.h6
-rw-r--r--clang/test/Modules/Inputs/submodule-visibility/other.h9
-rw-r--r--clang/test/Modules/submodule-visibility.cpp9
3 files changed, 23 insertions, 1 deletions
diff --git a/clang/test/Modules/Inputs/submodule-visibility/b.h b/clang/test/Modules/Inputs/submodule-visibility/b.h
index 67ef6529dbd..39df6a02cb4 100644
--- a/clang/test/Modules/Inputs/submodule-visibility/b.h
+++ b/clang/test/Modules/Inputs/submodule-visibility/b.h
@@ -4,7 +4,11 @@ int m = n;
#include "c.h"
#if defined(A) && !defined(ALLOW_NAME_LEAKAGE)
-#error A is defined
+#warning A is defined
#endif
#define B
+
+template<typename T> void b_template() {
+ N::C::f(0);
+}
diff --git a/clang/test/Modules/Inputs/submodule-visibility/other.h b/clang/test/Modules/Inputs/submodule-visibility/other.h
index f40c757ca62..4b68c489153 100644
--- a/clang/test/Modules/Inputs/submodule-visibility/other.h
+++ b/clang/test/Modules/Inputs/submodule-visibility/other.h
@@ -1 +1,10 @@
#include "c.h"
+
+#ifndef OTHER_H
+#define OTHER_H
+namespace N {
+ struct C {
+ template<typename U> static void f(U) {}
+ };
+}
+#endif
diff --git a/clang/test/Modules/submodule-visibility.cpp b/clang/test/Modules/submodule-visibility.cpp
index 345ae155bb3..4c066e6ab9b 100644
--- a/clang/test/Modules/submodule-visibility.cpp
+++ b/clang/test/Modules/submodule-visibility.cpp
@@ -3,6 +3,11 @@
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-local-submodule-visibility -fmodules-cache-path=%t -I%S/Inputs/submodule-visibility -verify %s -DIMPORT
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-local-submodule-visibility -fmodules-cache-path=%t -fmodule-name=x -I%S/Inputs/submodule-visibility -verify %s
// RUN: %clang_cc1 -fimplicit-module-maps -fmodules-local-submodule-visibility -fmodules-cache-path=%t -I%S/Inputs/submodule-visibility -verify %s
+//
+// Explicit module builds.
+// RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility -emit-module -x c++-module-map %S/Inputs/submodule-visibility/module.modulemap -fmodule-name=other -o %t/other.pcm
+// RUN: %clang_cc1 -fmodules -fmodule-map-file=%S/Inputs/submodule-visibility/module.modulemap -fmodules-local-submodule-visibility -fmodule-file=%t/other.pcm -verify -fmodule-name=x -I%S/Inputs/submodule-visibility %s
+// RUN: %clang_cc1 -fmodules -fmodule-map-file=%S/Inputs/submodule-visibility/module.modulemap -fmodule-file=%t/other.pcm -verify -fmodule-name=x -I%S/Inputs/submodule-visibility %s -DALLOW_TEXTUAL_NAME_LEAKAGE
#include "a.h"
#include "b.h"
@@ -11,6 +16,8 @@
// expected-no-diagnostics
#elif IMPORT
// expected-error@-6 {{could not build module 'x'}}
+#elif ALLOW_TEXTUAL_NAME_LEAKAGE
+// expected-warning@b.h:7 {{A is defined}}
#else
// The use of -fmodule-name=x causes us to textually include the above headers.
// The submodule visibility rules are still applied in this case.
@@ -35,3 +42,5 @@ typedef struct {
int p;
void (*f)(int p);
} name_for_linkage;
+
+void g() { b_template<int>(); }
OpenPOWER on IntegriCloud