1 /* { dg-do compile } */
2 /* { dg-additional-options "-Wno-return-type" } */
3 
4 struct A {
operator ()A5   bool operator()(int p1, int p2) { return p1 && p2; }
6 };
7 class B {
8 public:
9   bool *cbegin();
10   bool *cend();
11 };
operator &&(B p1,T p2)12 template <class T> void operator&&(B p1, T p2) {
13   B a;
14   arrayContTransform(p1, p2, a, A());
15 }
16 
17 template <typename _InputIterator1, typename T, typename _OutputIterator,
18           typename _BinaryOperation>
myrtransform(_InputIterator1 p1,_OutputIterator p2,T p3,_BinaryOperation p4)19 void myrtransform(_InputIterator1 p1, _OutputIterator p2, T p3,
20                   _BinaryOperation p4) {
21   _InputIterator1 b;
22   for (; b != p1; ++b, ++p2)
23     *p2 = p4(*b, p3);
24 }
25 
26 template <typename L, typename R, typename RES, typename BinaryOperator>
arrayContTransform(L p1,R p2,RES p3,BinaryOperator p4)27 void arrayContTransform(L p1, R p2, RES p3, BinaryOperator p4) {
28   myrtransform(p1.cend(), p3.cbegin(), p2, p4);
29 }
30 
31 class C {
32 public:
33   B getArrayBool();
34 };
35 class D {
36   B getArrayBool(const int &);
37   C lnode_p;
38 };
39 bool c;
getArrayBool(const int &)40 B D::getArrayBool(const int &) { lnode_p.getArrayBool() && c; }
41 
42 // { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { target { i?86-*-* x86_64-*-* } } } }
43