blob: 7e3b305db11aa7df7b9c21d0d858a72984491276 [file] [log] [blame]
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: cxx_compiler cxx_11 -c %s -o %t.o
// RUN: bindump %t.o | FileCheck prefixes %s
// Literals in expressions.
// CHECK-DAG: _Z1fIiEvRAszplcvT__EngLi42E_c
// NB no negative integer literals
template <class T> void f(char (&buffer)[sizeof(T() + -42)]) {}
void call_f() {
char buffer[sizeof(int)];
f<int>(buffer);
}
// float
// CHECK-DAG: _Z1gIfEvRAszplcvT__ELf40a00000E_c
template <class T> void g(char (&buffer)[sizeof(T() + 5.0f)]) {}
void call_g() {
char buffer[sizeof(float)];
g<float>(buffer);
}
// negative float (uses unary negation)
// CHECK-DAG: _Z2g2IfEvRAszplcvT__EngLf3f800000E_c
template <class T> void g2(char (&buffer)[sizeof(T() + -1.0f)]) {}
void call_g2() {
char buffer[sizeof(float)];
g2<float>(buffer);
}
// CHECK-DAG: _Z2g3IdEvRAszplcvT__ELd4014000000000000E_c
template <class T> void g3(char (&buffer)[sizeof(T() + 5.0)]) {}
void call_g3() {
char buffer[sizeof(double)];
g3<double>(buffer);
}
// Generate raw pointer literal expression nullptr (rather than template argument that happens to be a null pointer).
// CHECK-DAG: _Z1hIiEvRAszcvPT_LDnE_c
template <class T> void h(char (&buffer)[sizeof((T*)nullptr)]) {}
void call_h() {
char buffer[sizeof((int*)nullptr)];
h<int>(buffer);
}
// string literals
// CHECK-DAG: _Z3fooIiEDTcl3barfp_LA4_KwEEET_
int bar(int x, const wchar_t *);
template<class T> auto foo(T x) -> decltype(bar(x, L"abc"));
template <> auto foo<int>(int x) -> decltype(bar(x, L"abc")) { return 0; }
// CHECK-DAG: _Z4foo1IfEDTcl4bar1fp_LA5_KcEEET_
float bar1(float x, const char *);
template<class T> auto foo1(T x) -> decltype(bar1(x, "abcd"));
template <> auto foo1<float>(float x) -> decltype(bar1(x, "abcd")) { return 0; }