teak-llvm/clang/test/SemaCXX/attr-notail.cpp
Akira Hatanaka c866762272 Add support for function attribute 'not_tail_called'.
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
2015-11-06 23:56:15 +00:00

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();
};