1 // PR sanitizer/64984
2 // { dg-do compile }
3 // { dg-options "-fsanitize=vptr -std=gnu++11" }
4 
5 template <typename X, X> struct K
6 {
7   static constexpr X v = 0;
8   typedef K t;
9 };
10 template <typename...> struct A;
11 template <typename X, typename Y>
12 struct A<X, Y> : Y
13 {
14 };
15 template <typename X> X M ();
16 template <typename...> struct B;
17 template <typename X, typename Y>
18 struct B<X, Y> : K<int, noexcept (static_cast<X>(M<Y>()))>
19 {
20 };
21 template <typename X, typename... Y>
22 struct G : A<int, B<X, Y...>>::t
23 {
24 };
25 template <typename X> struct J : G<X, X&&>
26 {
27 };
28 template <typename X> X&& foo (X&);
29 template <typename X> X&& bar (X&&);
30 template <typename X> struct P
31 {
32   P (X& x) : q (x) {}
33   X q;
34 };
35 template <typename...> struct Q;
36 template <typename X>
37 struct Q<X> : P<X>
38 {
39   typedef P<X> r;
40   X& s (Q&);
41   Q (X& x) : r (x) {}
42   Q (Q&& x) noexcept (J<X>::v) : r (foo<X>(s (x)))
43   {
44   }
45 };
46 template <typename... X> struct I : Q<X...>
47 {
48   I ();
49   I (X&... x) : Q<X...>(x...)
50   {
51   }
52 };
53 template <typename... X>
54 I<X&&...> baz (X&&... x)
55 {
56   return I <X&&...> (foo<X>(x)...);
57 }
58 template <typename X> struct F
59 {
60   int p;
61   void operator[] (X&& x)
62   {
63     baz (bar (x));
64   }
65 };
66 struct U
67 {
68   virtual ~U ();
69 };
70 
71 int
72 main ()
73 {
74   F<U> m;
75   m[U ()];
76 }
77