```
#include <tuple>

int foo() {
  return std::get<0>(std::make_tuple(1,"2"));
}

int main() {
  return foo();
}
```

clang++ with -O3

```
; Function Attrs: nounwind readnone ssp uwtable
define i32 @_Z3foov() #0 {
entry:
  ret i32 1
}

; Function Attrs: nounwind readnone ssp uwtable
define i32 @main() #0 {
entry:
  ret i32 1
}
```

FYI without optimization it is scary:

```
; Function Attrs: ssp uwtable
define i32 @_Z3foov() #0 {
entry:
  %this.addr.i.i2 = alloca %"class.std::__1::__tuple_leaf"*, align 8
  %__t.addr.i3 = alloca %"class.std::__1::tuple"*, align 8
  %__t.addr.i4.i = alloca [2 x i8]*, align 8
  %__t.addr.i8.i.i.i = alloca [2 x i8]*, align 8
  %__t.addr.i.i10.i.i.i.i.i = alloca i32*, align 8
  %this.addr.i11.i.i.i.i.i = alloca %"class.std::__1::__tuple_leaf"*, align 8
  %__t.addr.i12.i.i.i.i.i = alloca i32*, align 8
  %__t.addr.i9.i.i.i.i.i = alloca [2 x i8]*, align 8
  %__t.addr.i.i.i.i.i.i.i = alloca [2 x i8]*, align 8
  %this.addr.i.i.i.i.i.i = alloca %"class.std::__1::__tuple_leaf.0"*, align 8
  %__t.addr.i8.i.i.i.i.i = alloca [2 x i8]*, align 8
  %__t.addr.i.i.i.i.i.i = alloca i32*, align 8
  %0 = alloca %"struct.std::__1::__tuple_indices", align 1
  %1 = alloca %"struct.std::__1::__tuple_types", align 1
  %2 = alloca %"struct.std::__1::__tuple_indices.1", align 1
  %3 = alloca %"struct.std::__1::__tuple_types.2", align 1
  %this.addr.i.i.i.i.i = alloca %"struct.std::__1::__tuple_impl"*, align 8
  %__u.addr.i.i.i.i.i = alloca i32*, align 8
  %__u.addr5.i.i.i.i.i = alloca [2 x i8]*, align 8
  %4 = alloca %"struct.std::__1::__tuple_indices", align 1
  %5 = alloca %"struct.std::__1::__tuple_types", align 1
  %6 = alloca %"struct.std::__1::__tuple_indices.1", align 1
  %7 = alloca %"struct.std::__1::__tuple_types.2", align 1
  %this.addr.i.i.i.i = alloca %"struct.std::__1::__tuple_impl"*, align 8
  %__u.addr.i.i.i.i = alloca i32*, align 8
  %__u.addr5.i.i.i.i = alloca [2 x i8]*, align 8
  %__t.addr.i.i.i.i = alloca i32*, align 8
  %this.addr.i.i.i = alloca %"class.std::__1::tuple"*, align 8
  %__u.addr.i.i.i = alloca i32*, align 8
  %__u.addr2.i.i.i = alloca [2 x i8]*, align 8
  %agg.tmp.i.i.i = alloca %"struct.std::__1::__tuple_indices", align 1
  %agg.tmp4.i.i.i = alloca %"struct.std::__1::__tuple_types", align 1
  %agg.tmp5.i.i.i = alloca %"struct.std::__1::__tuple_indices.1", align 1
  %agg.tmp6.i.i.i = alloca %"struct.std::__1::__tuple_types.2", align 1
  %this.addr.i.i = alloca %"class.std::__1::tuple"*, align 8
  %__u.addr.i.i = alloca i32*, align 8
  %__u.addr2.i.i = alloca [2 x i8]*, align 8
  %__t.addr.i.i = alloca i32*, align 8
  %__t.addr.i = alloca i32*, align 8
  %__t.addr2.i = alloca [2 x i8]*, align 8
  %ref.tmp = alloca %"class.std::__1::tuple", align 8
  %ref.tmp1 = alloca i32, align 4
  store i32 1, i32* %ref.tmp1
  store i32* %ref.tmp1, i32** %__t.addr.i, align 8
  store [2 x i8]* @.str, [2 x i8]** %__t.addr2.i, align 8
  %8 = load i32** %__t.addr.i, align 8
  store i32* %8, i32** %__t.addr.i.i, align 8
  %9 = load i32** %__t.addr.i.i, align 8
  %10 = load [2 x i8]** %__t.addr2.i, align 8
  store [2 x i8]* %10, [2 x i8]** %__t.addr.i4.i, align 8
  %11 = load [2 x i8]** %__t.addr.i4.i, align 8
  store %"class.std::__1::tuple"* %ref.tmp, %"class.std::__1::tuple"** %this.addr.i.i, align 8
  store i32* %9, i32** %__u.addr.i.i, align 8
  store [2 x i8]* %11, [2 x i8]** %__u.addr2.i.i, align 8
  %this3.i.i = load %"class.std::__1::tuple"** %this.addr.i.i
  %12 = load i32** %__u.addr.i.i
  %13 = load [2 x i8]** %__u.addr2.i.i
  store %"class.std::__1::tuple"* %this3.i.i, %"class.std::__1::tuple"** %this.addr.i.i.i, align 8
  store i32* %12, i32** %__u.addr.i.i.i, align 8
  store [2 x i8]* %13, [2 x i8]** %__u.addr2.i.i.i, align 8
  %this3.i.i.i = load %"class.std::__1::tuple"** %this.addr.i.i.i
  %base_.i.i.i = getelementptr inbounds %"class.std::__1::tuple"* %this3.i.i.i, i32 0, i32 0
  %14 = load i32** %__u.addr.i.i.i, align 8
  store i32* %14, i32** %__t.addr.i.i.i.i, align 8
  %15 = load i32** %__t.addr.i.i.i.i, align 8
  %16 = load [2 x i8]** %__u.addr2.i.i.i, align 8
  store [2 x i8]* %16, [2 x i8]** %__t.addr.i8.i.i.i, align 8
  %17 = load [2 x i8]** %__t.addr.i8.i.i.i, align 8
  store %"struct.std::__1::__tuple_impl"* %base_.i.i.i, %"struct.std::__1::__tuple_impl"** %this.addr.i.i.i.i, align 8
  store i32* %15, i32** %__u.addr.i.i.i.i, align 8
  store [2 x i8]* %17, [2 x i8]** %__u.addr5.i.i.i.i, align 8
  %this6.i.i.i.i = load %"struct.std::__1::__tuple_impl"** %this.addr.i.i.i.i
  %18 = load i32** %__u.addr.i.i.i.i
  %19 = load [2 x i8]** %__u.addr5.i.i.i.i
  store %"struct.std::__1::__tuple_impl"* %this6.i.i.i.i, %"struct.std::__1::__tuple_impl"** %this.addr.i.i.i.i.i, align 8
  store i32* %18, i32** %__u.addr.i.i.i.i.i, align 8
  store [2 x i8]* %19, [2 x i8]** %__u.addr5.i.i.i.i.i, align 8
  %this6.i.i.i.i.i = load %"struct.std::__1::__tuple_impl"** %this.addr.i.i.i.i.i
  %20 = bitcast %"struct.std::__1::__tuple_impl"* %this6.i.i.i.i.i to %"class.std::__1::__tuple_leaf"*
  %21 = load i32** %__u.addr.i.i.i.i.i, align 8
  store i32* %21, i32** %__t.addr.i.i.i.i.i.i, align 8
  %22 = load i32** %__t.addr.i.i.i.i.i.i, align 8
  store %"class.std::__1::__tuple_leaf"* %20, %"class.std::__1::__tuple_leaf"** %this.addr.i11.i.i.i.i.i, align 8
  store i32* %22, i32** %__t.addr.i12.i.i.i.i.i, align 8
  %this1.i13.i.i.i.i.i = load %"class.std::__1::__tuple_leaf"** %this.addr.i11.i.i.i.i.i
  %value.i14.i.i.i.i.i = getelementptr inbounds %"class.std::__1::__tuple_leaf"* %this1.i13.i.i.i.i.i, i32 0, i32 0
  %23 = load i32** %__t.addr.i12.i.i.i.i.i, align 8
  store i32* %23, i32** %__t.addr.i.i10.i.i.i.i.i, align 8
  %24 = load i32** %__t.addr.i.i10.i.i.i.i.i, align 8
  %25 = load i32* %24
  store i32 %25, i32* %value.i14.i.i.i.i.i, align 4
  %26 = bitcast %"struct.std::__1::__tuple_impl"* %this6.i.i.i.i.i to i8*
  %27 = getelementptr inbounds i8* %26, i64 8
  %28 = bitcast i8* %27 to %"class.std::__1::__tuple_leaf.0"*
  %29 = load [2 x i8]** %__u.addr5.i.i.i.i.i, align 8
  store [2 x i8]* %29, [2 x i8]** %__t.addr.i9.i.i.i.i.i, align 8
  %30 = load [2 x i8]** %__t.addr.i9.i.i.i.i.i, align 8
  store %"class.std::__1::__tuple_leaf.0"* %28, %"class.std::__1::__tuple_leaf.0"** %this.addr.i.i.i.i.i.i, align 8
  store [2 x i8]* %30, [2 x i8]** %__t.addr.i8.i.i.i.i.i, align 8
  %this1.i.i.i.i.i.i = load %"class.std::__1::__tuple_leaf.0"** %this.addr.i.i.i.i.i.i
  %value.i.i.i.i.i.i = getelementptr inbounds %"class.std::__1::__tuple_leaf.0"* %this1.i.i.i.i.i.i, i32 0, i32 0
  %31 = load [2 x i8]** %__t.addr.i8.i.i.i.i.i, align 8
  store [2 x i8]* %31, [2 x i8]** %__t.addr.i.i.i.i.i.i.i, align 8
  %32 = load [2 x i8]** %__t.addr.i.i.i.i.i.i.i, align 8
  %arraydecay.i.i.i.i.i.i = getelementptr inbounds [2 x i8]* %32, i32 0, i32 0
  store i8* %arraydecay.i.i.i.i.i.i, i8** %value.i.i.i.i.i.i, align 8
  store %"class.std::__1::tuple"* %ref.tmp, %"class.std::__1::tuple"** %__t.addr.i3, align 8
  %33 = load %"class.std::__1::tuple"** %__t.addr.i3, align 8
  %base_.i = getelementptr inbounds %"class.std::__1::tuple"* %33, i32 0, i32 0
  %34 = bitcast %"struct.std::__1::__tuple_impl"* %base_.i to %"class.std::__1::__tuple_leaf"*
  store %"class.std::__1::__tuple_leaf"* %34, %"class.std::__1::__tuple_leaf"** %this.addr.i.i2, align 8
  %this1.i.i = load %"class.std::__1::__tuple_leaf"** %this.addr.i.i2
  %value.i.i = getelementptr inbounds %"class.std::__1::__tuple_leaf"* %this1.i.i, i32 0, i32 0
  %35 = load i32* %value.i.i
  ret i32 %35
}

; Function Attrs: ssp uwtable
define i32 @main() #0 {
entry:
  %retval = alloca i32, align 4
  store i32 0, i32* %retval
  %call = call i32 @_Z3foov()
  ret i32 %call
}
```