diff options
| author | Alex Lorenz <arphaman@gmail.com> | 2016-11-02 15:46:34 +0000 |
|---|---|---|
| committer | Alex Lorenz <arphaman@gmail.com> | 2016-11-02 15:46:34 +0000 |
| commit | 560ae565e9fa981ce2a49282b71c1e716ff347d1 (patch) | |
| tree | e84aeceba2a821f6f863609ac9dd5307da27cb57 /clang/test | |
| parent | 93f2f7fb6c323083ec39abc0b67a9b51dc416684 (diff) | |
| download | bcm5719-llvm-560ae565e9fa981ce2a49282b71c1e716ff347d1.tar.gz bcm5719-llvm-560ae565e9fa981ce2a49282b71c1e716ff347d1.zip | |
Add a note that points to the linkage specifier for the C++ linkage errors
This commit improves the "must have C++ linkage" error diagnostics that are
emitted for C++ declarations like templates and literal operators by adding an
additional note that points to the appropriate extern "C" linkage specifier.
rdar://19021120
Differential Revision: https://reviews.llvm.org/D26189
llvm-svn: 285823
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/CXX/over/over.oper/over.literal/p6.cpp | 4 | ||||
| -rw-r--r-- | clang/test/SemaCXX/cxx0x-defaulted-functions.cpp | 2 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/class-template-decl.cpp | 6 |
3 files changed, 7 insertions, 5 deletions
diff --git a/clang/test/CXX/over/over.oper/over.literal/p6.cpp b/clang/test/CXX/over/over.oper/over.literal/p6.cpp index 6bfb8560d68..9ecf9ccccb1 100644 --- a/clang/test/CXX/over/over.oper/over.literal/p6.cpp +++ b/clang/test/CXX/over/over.oper/over.literal/p6.cpp @@ -1,9 +1,11 @@ // RUN: %clang_cc1 -std=c++11 %s -verify +// expected-note@+1 {{extern "C" language linkage specification begins here}} extern "C" void operator "" _a(const char *); // expected-error {{must have C++ linkage}} extern "C" template<char...> void operator "" _b(); // expected-error {{must have C++ linkage}} +// expected-note@-1 {{extern "C" language linkage specification begins here}} -extern "C" { +extern "C" { // expected-note 4 {{extern "C" language linkage specification begins here}} void operator "" _c(const char *); // expected-error {{must have C++ linkage}} template<char...> void operator "" _d(); // expected-error {{must have C++ linkage}} namespace N { diff --git a/clang/test/SemaCXX/cxx0x-defaulted-functions.cpp b/clang/test/SemaCXX/cxx0x-defaulted-functions.cpp index f4bbce818d9..f623dc765f8 100644 --- a/clang/test/SemaCXX/cxx0x-defaulted-functions.cpp +++ b/clang/test/SemaCXX/cxx0x-defaulted-functions.cpp @@ -180,7 +180,7 @@ namespace PR14577 { Outer<T>::Inner2<T>::~Inner2() = default; // expected-error {{nested name specifier 'Outer<T>::Inner2<T>::' for declaration does not refer into a class, class template or class template partial specialization}} expected-error {{only special member functions may be defaulted}} } -extern "C" { +extern "C" { // expected-note {{extern "C" language linkage specification begins here}} template<typename _Tp> // expected-error {{templates must have C++ linkage}} void PR13573(const _Tp&) = delete; } diff --git a/clang/test/SemaTemplate/class-template-decl.cpp b/clang/test/SemaTemplate/class-template-decl.cpp index 63482d84df0..2e36cae14f6 100644 --- a/clang/test/SemaTemplate/class-template-decl.cpp +++ b/clang/test/SemaTemplate/class-template-decl.cpp @@ -10,11 +10,11 @@ namespace N { template<typename T> class C; } -extern "C" { +extern "C" { // expected-note {{extern "C" language linkage specification begins here}} template<typename T> class D; // expected-error{{templates must have C++ linkage}} } -extern "C" { +extern "C" { // expected-note 2 {{extern "C" language linkage specification begins here}} class PR17968 { template<typename T> class D; // expected-error{{templates must have C++ linkage}} template<typename T> void f(); // expected-error{{templates must have C++ linkage}} @@ -148,7 +148,7 @@ namespace redecl { } extern "C" template <typename T> // expected-error{{templates must have C++ linkage}} -void DontCrashOnThis() { +void DontCrashOnThis() { // expected-note@-1 {{extern "C" language linkage specification begins here}} T &pT = T(); pT; } |

