If the sole distinction between two declarations is that one has a __restrict qualifier then we should not consider it to be an overload. Instead, we will consider it as an incompatible redeclaration which is similar to how MSVC, ICC and GCC would handle it. This fixes PR17786. N.B. We must not mangle in __restrict into method qualifiers becase we don't allow overloading between such declarations anymore. To do otherwise would be a violation of the Itanium ABI. llvm-svn: 193964
41 lines
1.6 KiB
C++
41 lines
1.6 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
void f();
|
|
void f(int);
|
|
void f(int, float);
|
|
void f(int, int);
|
|
void f(int, ...);
|
|
|
|
typedef float Float;
|
|
void f(int, Float); // expected-note {{previous declaration is here}}
|
|
|
|
int f(int, Float); // expected-error {{functions that differ only in their return type cannot be overloaded}}
|
|
|
|
void g(void); // expected-note {{previous declaration is here}}
|
|
int g(); // expected-error {{functions that differ only in their return type cannot be overloaded}}
|
|
|
|
typedef int INT;
|
|
|
|
class X {
|
|
void f();
|
|
void f(int); // expected-note {{previous declaration is here}}
|
|
void f() const;
|
|
|
|
void f(INT); // expected-error{{cannot be redeclared}}
|
|
|
|
void g(int); // expected-note {{previous declaration is here}}
|
|
void g(int, float); // expected-note {{previous declaration is here}}
|
|
int g(int, Float); // expected-error {{functions that differ only in their return type cannot be overloaded}}
|
|
|
|
static void g(float); // expected-note {{previous declaration is here}}
|
|
static void g(int); // expected-error {{static and non-static member functions with the same parameter types cannot be overloaded}}
|
|
static void g(float); // expected-error {{class member cannot be redeclared}}
|
|
|
|
void h(); // expected-note {{previous declaration is here}} \
|
|
expected-note {{previous declaration is here}}
|
|
void h() __restrict; // expected-error {{class member cannot be redeclared}} \
|
|
expected-error {{conflicting types for 'h'}}
|
|
};
|
|
|
|
int main() {} // expected-note {{previous definition is here}}
|
|
int main(int,char**) {} // expected-error {{conflicting types for 'main'}}
|