break;
case tok::pp___public_macro:
- if (getLangOpts().Modules)
+ if (getLangOpts().Modules || getLangOpts().ModulesLocalVisibility)
return HandleMacroPublicDirective(Result);
break;
case tok::pp___private_macro:
- if (getLangOpts().Modules)
+ if (getLangOpts().Modules || getLangOpts().ModulesLocalVisibility)
return HandleMacroPrivateDirective();
break;
}
--- /dev/null
+// RUN: rm -rf %t
+//
+// RUN: %clang_cc1 %s \
+// RUN: -fmodules-local-submodule-visibility \
+// RUN: -fmodule-map-file=%S/Inputs/lsv-private-macro/mod.map \
+// RUN: -I%S/Inputs/lsv-private-macro -fmodule-name=self \
+// RUN: -verify=expected-lsv
+//
+// RUN: %clang_cc1 %s \
+// RUN: -fmodules -fmodules-cache-path=%t \
+// RUN: -fmodule-map-file=%S/Inputs/lsv-private-macro/mod.map \
+// RUN: -I%S/Inputs/lsv-private-macro -fmodule-name=self \
+// RUN: -verify=expected-nolsv
+//
+// RUN: %clang_cc1 %s \
+// RUN: -fmodules -fmodules-cache-path=%t \
+// RUN: -fmodules-local-submodule-visibility \
+// RUN: -fmodule-map-file=%S/Inputs/lsv-private-macro/mod.map \
+// RUN: -I%S/Inputs/lsv-private-macro -fmodule-name=self \
+// RUN: -verify=expected-lsv
+
+#include "self.h"
+
+// With local submodule visibility enabled, private macros don't leak out of
+// their respective submodules, even within the same top-level module.
+// expected-lsv-no-diagnostics
+
+// expected-nolsv-error@+2 {{SELF_PRIVATE defined}}
+#ifdef SELF_PRIVATE
+#error SELF_PRIVATE defined
+#endif
+
+#ifndef SELF_PUBLIC
+#error SELF_PUBLIC not defined
+#endif
+
+#ifndef SELF_DEFAULT
+#error SELF_DEFAULT not defined
+#endif
+
+#include "other.h"
+
+#ifdef OTHER_PRIVATE
+#error OTHER_PRIVATE defined
+#endif
+
+#ifndef OTHER_PUBLIC
+#error OTHER_PUBLIC not defined
+#endif
+
+#ifndef OTHER_DEFAULT
+#error OTHER_DEFAULT not defined
+#endif