1 // PR middle-end/68259
2 
3 // { dg-do compile }
4 // { dg-options "-fsanitize=undefined -w" }
5 
6 namespace std {
7   template < typename _Tp > class allocator { };
8     template < typename _Tp, typename _Alloc
9 = std::allocator < _Tp >
10 >class vector {
11   public:
12 typedef _Tp value_type;
push_back(const value_type & __x)13     void push_back (const value_type & __x) { }
14   };
15 }
16 class Foo;
17 class FooBar {
18 public:
19 Foo * primitive_context;
FooBar()20   FooBar () { }
21   FooBar (const FooBar & pnhp);
22 };
23 template < class KEY, class CONTENT > class AVLTreeNode { };
24 template < class KEY, class CONTENT > class FooTree final
25 {
26   FooBar insertPrimitive ();
27 public:
seek_no_lock(const KEY & key)28 AVLTreeNode < KEY, CONTENT > *seek_no_lock (const KEY & key) { }
29   void primitive_patterns ( std::vector < FooBar > &patterns);
30 };
31 template < class KEY, class CONTENT > void FooTree < KEY,
primitive_patterns(std::vector<FooBar> & patterns)32   CONTENT >::primitive_patterns ( std::vector <FooBar > &patterns)
33 {
34     patterns.push_back (insertPrimitive());
35 }
36 template < class KEY, class CONTENT >
insertPrimitive()37 FooBar FooTree < KEY, CONTENT >::insertPrimitive ()
38 {
39   FooBar place;
40   seek_no_lock (place.primitive_context);
41   return place;
42 }
43 class ManuverResults { };
44 class opc_info_t
45 {
46 public:
47 FooTree < Foo *, ManuverResults > *primitivecache;
48 };
49 static void
do_optical_prox_corr_tsafe(opc_info_t * opc_info)50 do_optical_prox_corr_tsafe (opc_info_t * opc_info)
51 {
52   std::vector < FooBar > patterns;
53   opc_info->primitivecache->primitive_patterns (patterns);
54 }
55