This attribute is used to prevent tail-call optimizations to the marked
function. For example, in the following piece of code, foo1 will not be
tail-call optimized:
int __attribute__((not_tail_called)) foo1(int);
int foo2(int a) {
return foo1(a); // Tail-call optimization is not performed.
}
The attribute has effect only on statically bound calls. It has no
effect on indirect calls. Also, virtual functions and objective-c
methods cannot be marked as 'not_tail_called'.
rdar://problem/22667622
Differential Revision: http://reviews.llvm.org/D12922
llvm-svn: 252369
17 lines
548 B
C++
17 lines
548 B
C++
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
|
|
|
|
class Base {
|
|
public:
|
|
[[clang::not_tail_called]] virtual int foo1(); // expected-error {{'not_tail_called' attribute cannot be applied to virtual functions}}
|
|
virtual int foo2();
|
|
[[clang::not_tail_called]] int foo3();
|
|
virtual ~Base() {}
|
|
};
|
|
|
|
class Derived1 : public Base {
|
|
public:
|
|
int foo1() override;
|
|
[[clang::not_tail_called]] int foo2() override; // expected-error {{'not_tail_called' attribute cannot be applied to virtual functions}}
|
|
[[clang::not_tail_called]] int foo4();
|
|
};
|