================
@@ -0,0 +1,102 @@
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s
+
+class SomeClass {
+public:
+  int Data;
+};
+
+// Returning pointers to data members is not allowed.
+struct DataMemberSpan {
+  int SomeClass::* member_ptr;
+  int n;
+};
+
+// expected-warning@+2 {{attribute only applies to functions that return 
span-like structures}}
+// expected-note@+1 {{returned struct/class fields are not a supported 
combination}}
+DataMemberSpan returns_data_member_span(void) __attribute((malloc_span)) {
+  return DataMemberSpan{};
+}
+
+// Returning pointers to member functions is not allowed.
+struct MemberFuncSpan {
+  void (SomeClass::*member_func_ptr)();
+  int n;
+};
+
+// expected-warning@+2 {{attribute only applies to functions that return 
span-like structures}}
+// expected-note@+1 {{returned struct/class fields are not a supported 
combination}}
+MemberFuncSpan returns_member_func_span(void) __attribute((malloc_span)) {
+  return MemberFuncSpan{};
+}
+
+template<typename FirstType, typename SecondType>
+struct Pair {
+  FirstType first;
+  SecondType second;
+};
+
+Pair<int*, int> returns_templated_span1(void) __attribute((malloc_span)) { // 
no-warning
+  return Pair<int*, int>{};
+}
+
+Pair<int*, int*> returns_templated_span2(void) __attribute((malloc_span)) { // 
no-warning
+  return Pair<int*, int*>{};
+}
+
+// expected-warning@+2 {{attribute only applies to functions that return 
span-like structures}}
+// expected-note@+1 {{returned struct/class fields are not a supported 
combination for a span-like type}}
+Pair<int, int> returns_templated_span3(void) __attribute((malloc_span)) {
+  return Pair<int, int>{};
+}
+
+// Verify that semantic checks are done on dependent types.
+
+struct GoodSpan {
+  void *ptr;
+  int n;
+};
+
+struct BadSpan {
+  int n;
+};
+
+template <typename T>
+// expected-warning@+2 {{'malloc_span' attribute only applies to functions 
that return span-like structures}}
+// expected-note@+1 {{returned struct/class has 1 fields, expected 2}}
+T produce_span() __attribute((malloc_span)) {
+  return T{};
+}
+
+void TestGoodBadSpan() {
+  produce_span<GoodSpan>(); // no-warnings
+  // expected-note@+1 {{in instantiation of function template specialization 
'produce_span<BadSpan>' requested here}}
+  produce_span<BadSpan>();
+}
+
+// Ensure that trailing return types are also supported.
+__attribute__((malloc_span)) auto trailling_return_type(int size)  -> GoodSpan 
{ // no-warning
+  return GoodSpan{};
+}
+
+template<typename T>
+// expected-warning@+2 {{'malloc_span' attribute only applies to functions 
that return span-like structures}}
+// expected-note@+1 {{returned struct/class has 1 fields, expected 2}}
+__attribute__((malloc_span)) auto templated_trailling_return_type()  -> T { // 
no-warning
----------------
melver wrote:

Why does this say "no-warning" ? The "expected-warning@+2" says that exactly on 
this line there's a warning.

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

Reply via email to