This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[testsuite] Fix std::strchr etc. prototypes for C++


On Thu, Jan 29, 2009 at 11:43:27AM -0800, Benjamin Kosnik wrote:
> > Attached is also a testcase that verifies this, but we'd probably
> > need a new tcl function to check if glibc is used and has recent
> > enough headers to allow the testcase to pass.
> 
> Or you could just wrap the proposed new testcase with #ifdef
> __CORRECT_ISO_CPP_STRING_H_PROTO for now. 

Here are testcases tested both with old and latest glibc.
builtin10.C tests that the functions are considered builtins and optimized
as such, 3.cc verifies the required diagnostics.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2009-01-30  Jakub Jelinek  <jakub@redhat.com>

	* lib/target-supports.exp
	(check_effective_target_correct_iso_cpp_string_wchar_protos): New.
	* g++.dg/ext/builtin10.C: New test.

	* testsuite/21_strings/c_strings/char/3.cc: New test.
	* testsuite/21_strings/c_strings/wchar_t/3.cc: New test.

--- gcc/testsuite/lib/target-supports.exp.jj	2009-01-15 00:21:38.000000000 +0100
+++ gcc/testsuite/lib/target-supports.exp	2009-01-30 14:36:23.000000000 +0100
@@ -1,4 +1,4 @@
-#   Copyright (C) 1999, 2001, 2003, 2004, 2005, 2006, 2007, 2008
+#   Copyright (C) 1999, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009
 #    Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
@@ -2815,3 +2815,20 @@ proc check_effective_target_hard_dfp {} 
 	void foo (void) { z = x + y; }
     }]
 }
+
+# Return 1 if string.h and wchar.h headers provide C++ requires overloads
+# for strchr etc. functions.
+
+proc check_effective_target_correct_iso_cpp_string_wchar_protos { } {
+    return [check_no_compiler_messages correct_iso_cpp_string_wchar_protos assembly {
+	#include <string.h>
+	#include <wchar.h>
+	#if !defined(__cplusplus) \
+	    || !defined(__CORRECT_ISO_CPP_STRING_H_PROTO) \
+	    || !defined(__CORRECT_ISO_CPP_WCHAR_H_PROTO)
+	ISO C++ correct string.h and wchar.h protos not supported.
+	#else
+	int i;
+	#endif
+    }]
+}
--- gcc/testsuite/g++.dg/ext/builtin10.C.jj	2009-01-30 14:51:11.000000000 +0100
+++ gcc/testsuite/g++.dg/ext/builtin10.C	2009-01-30 15:02:00.000000000 +0100
@@ -0,0 +1,56 @@
+// { dg-do compile { target correct_iso_cpp_string_wchar_protos } }
+// { dg-options "-O2 -fdump-tree-optimized" }
+
+#include <cstring>
+
+const void *cv1;
+const char *cc1, *cc2, *cc3, *cc4;
+void *v1;
+char *c1, *c2, *c3, *c4;
+
+void
+f1 (void)
+{
+  cv1 = memchr ("abcba", 'b', 3);
+  cc1 = strchr ("abcba", 'b');
+  cc2 = strrchr ("abcba", 'b');
+  cc3 = strpbrk ("dabc", "abc");
+  cc4 = strstr ("aaabc", "abc");
+}
+
+void
+f2 (void)
+{
+  cv1 = std::memchr ("abcba", 'b', 3);
+  cc1 = std::strchr ("abcba", 'b');
+  cc2 = std::strrchr ("abcba", 'b');
+  cc3 = std::strpbrk ("dabc", "abc");
+  cc4 = std::strstr ("aaabc", "abc");
+}
+
+void
+f3 (void)
+{
+  v1 = memchr ((char *)"abcba", 'b', 3);
+  c1 = strchr ((char *)"abcba", 'b');
+  c2 = strrchr ((char *)"abcba", 'b');
+  c3 = strpbrk ((char *)"dabc", "abc");
+  c4 = strstr ((char *)"aaabc", "abc");
+}
+
+void
+f4 (void)
+{
+  v1 = std::memchr ((char *)"abcba", 'b', 3);
+  c1 = std::strchr ((char *)"abcba", 'b');
+  c2 = std::strrchr ((char *)"abcba", 'b');
+  c3 = std::strpbrk ((char *)"dabc", "abc");
+  c4 = std::strstr ((char *)"aaabc", "abc");
+}
+
+// { dg-final { scan-tree-dump-not "memchr" "optimized" } }
+// { dg-final { scan-tree-dump-not "strchr" "optimized" } }
+// { dg-final { scan-tree-dump-not "strrchr" "optimized" } }
+// { dg-final { scan-tree-dump-not "strpbrk" "optimized" } }
+// { dg-final { scan-tree-dump-not "strstr" "optimized" } }
+// { dg-final { cleanup-tree-dump "optimized" } }
--- libstdc++-v3/testsuite/21_strings/c_strings/char/3.cc.jj	2009-01-30 14:29:23.000000000 +0100
+++ libstdc++-v3/testsuite/21_strings/c_strings/char/3.cc	2009-01-30 14:30:27.000000000 +0100
@@ -0,0 +1,37 @@
+// { dg-do compile { target correct_iso_cpp_string_wchar_protos } }
+// { dg-options "-O2" }
+
+#include <cstring>
+
+const char *cc1, *cc2;
+char *c1, *c2;
+const void *cv1, *cv2;
+void *v1, *v2;
+
+void
+test01 ()
+{
+  v1 = std::memchr (v2, '/', 3);
+  c1 = std::strchr (c2, '/');
+  c1 = std::strrchr (c2, 'c');
+  c1 = std::strpbrk (c2, "abc");
+  c1 = std::strstr (c2, "abc");
+
+  cv1 = std::memchr (v2, '/', 3);
+  cc1 = std::strchr (c2, '/');
+  cc1 = std::strrchr (c2, 'c');
+  cc1 = std::strpbrk (c2, "abc");
+  cc1 = std::strstr (c2, "abc");
+
+  v1 = std::memchr (cv2, '/', 3);	// { dg-error "invalid conversion" }
+  c1 = std::strchr (cc2, '/');		// { dg-error "invalid conversion" }
+  c1 = std::strrchr (cc2, 'c');		// { dg-error "invalid conversion" }
+  c1 = std::strpbrk (cc2, "abc");	// { dg-error "invalid conversion" }
+  c1 = std::strstr (cc2, "abc");	// { dg-error "invalid conversion" }
+
+  cv1 = std::memchr (cv2, '/', 3);
+  cc1 = std::strchr (cc2, '/');
+  cc1 = std::strrchr (cc2, 'c');
+  cc1 = std::strpbrk (cc2, "abc");
+  cc1 = std::strstr (cc2, "abc");
+}
--- libstdc++-v3/testsuite/21_strings/c_strings/wchar_t/3.cc.jj	2009-01-30 14:29:36.000000000 +0100
+++ libstdc++-v3/testsuite/21_strings/c_strings/wchar_t/3.cc	2009-01-30 14:30:00.000000000 +0100
@@ -0,0 +1,35 @@
+// { dg-do compile { target correct_iso_cpp_string_wchar_protos } }
+// { dg-options "-O2" }
+
+#include <cwchar>
+
+const wchar_t *cw1, *cw2;
+wchar_t *w1, *w2;
+
+void
+test01 ()
+{
+  w1 = wmemchr (w2, L'/', 3);
+  w1 = wcschr (w2, L'/');
+  w1 = wcspbrk (w2, L"abc");
+  w1 = wcsrchr (w2, L'c');
+  w1 = wcsstr (w2, L"abc");
+
+  cw1 = wmemchr (w2, L'/', 3);
+  cw1 = wcschr (w2, L'/');
+  cw1 = wcspbrk (w2, L"abc");
+  cw1 = wcsrchr (w2, L'c');
+  cw1 = wcsstr (w2, L"abc");
+
+  w1 = wmemchr (cw2, L'/', 3);		// { dg-error "invalid conversion" }
+  w1 = wcschr (cw2, L'/');		// { dg-error "invalid conversion" }
+  w1 = wcspbrk (cw2, L"abc");		// { dg-error "invalid conversion" }
+  w1 = wcsrchr (cw2, L'c');		// { dg-error "invalid conversion" }
+  w1 = wcsstr (cw2, L"abc");		// { dg-error "invalid conversion" }
+
+  cw1 = wmemchr (cw2, L'/', 3);
+  cw1 = wcschr (cw2, L'/');
+  cw1 = wcspbrk (cw2, L"abc");
+  cw1 = wcsrchr (cw2, L'c');
+  cw1 = wcsstr (cw2, L"abc");
+}

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]