================
@@ -0,0 +1,128 @@
+// Verify that -mloadtime-comment-vars= diagnoses C++ variables it cannot
+// preserve.
+//
+// Three scenarios are covered, each with its own set of named variables and
+// its own -verify prefix:
+//
+//   storage — storage duration: thread_local variables and a name-matched
+//             function-local static are diagnosed; a namespace-scope
+//             variable is accepted without diagnostic. Also covers a
+//             name-matched variable of an unsupported (wide character)
+//             type, which is diagnosed.
+//   init    — initializer form: dynamically initialized pointers, and
+//             constant initializers that are not a direct string literal
+//             (pointer to another global, consteval call, user-defined
+//             literal), are diagnosed. (-std=c++20 for consteval.)
+//   kinds   — unsupported declaration kinds: name-matched static data
+//             members (out-of-line, in-class inline, instantiated from a
+//             class template), variable template specializations
+//             (explicit and implicit), and namespace-scope inline variables
+//             are diagnosed.
+
+// RUN: %clang_cc1 -std=c++20 -triple powerpc64-ibm-aix \
+// RUN:   
-mloadtime-comment-vars=keep,_ZN1N2tlE,_ZL3stl,_ZN1A2tmE,_ZZ1fvE2fn,_ZL4wstr \
+// RUN:   -fsyntax-only -verify=storage %s
+
+// RUN: %clang_cc1 -std=c++20 -triple powerpc64-ibm-aix \
+// RUN:   -mloadtime-comment-vars=p_ok,arr_ok,p_dyn,p_ind,p_ce,p_udl \
+// RUN:   -fsyntax-only -verify=init %s
+
+// RUN: %clang_cc1 -std=c++20 -triple powerpc64-ibm-aix \
+// RUN:   
-mloadtime-comment-vars=_ZN2B23sidE,_ZN2B34isidE,_Z2vtIcE,_Z2vtIiE,_ZN2SCIiE1mE,_ZN1M2ivE
 \
+// RUN:   -fsyntax-only -verify=kinds %s
+
+// ---- storage: storage-duration cases 
----------------------------------------
+
+// A namespace-scope variable with static storage duration is supported; no
+// diagnostic is expected.
+const char *keep = "@(#) keep";
+
+namespace N {
+// A thread_local variable has thread storage duration rather than static,
+// so it is diagnosed.
+thread_local const char *tl = "@(#) tl"; // storage-warning {{'tl' named in 
'-mloadtime-comment-vars=' does not have static storage duration and will not 
be preserved}}
+} // namespace N
+
+// 'static' here changes linkage only; storage duration is still thread.
+static thread_local const char *stl = "@(#) stl"; // storage-warning {{'stl' 
named in '-mloadtime-comment-vars=' does not have static storage duration and 
will not be preserved}}
+
+struct A {
+  static thread_local const char *tm;
+};
+// The static-data-member reason outranks the storage-duration one.
+thread_local const char *A::tm = "@(#) tm"; // storage-warning {{'tm' named in 
'-mloadtime-comment-vars=' is a static data member and will not be preserved}}
+
+// Function-local static: a name match demonstrates intent, so it is
+// diagnosed rather than silently ignored.
+void f() { static const char *fn = "@(#) fn"; (void)fn; } // storage-warning 
{{'fn' named in '-mloadtime-comment-vars=' is a function-local variable and 
will not be preserved}}
+
+// A name match on a variable of an unsupported type is diagnosed as well.
+static wchar_t wstr[] = L"@(#) w"; // storage-warning {{'wstr' named in 
'-mloadtime-comment-vars=' does not have a plain char pointer or array type and 
will not be preserved}}
+
----------------
tonykuttai wrote:

Both are moved to the kinds scenario, now described as unsupported declaration 
kinds and types.  storage keeps only the thread_local cases.

https://github.com/llvm/llvm-project/pull/187986
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to