diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-07-23 05:45:25 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-07-23 05:45:25 +0000 |
commit | eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0 (patch) | |
tree | ae1948b1996d0c59ea4f597701504ea5e8caa25c /test | |
parent | 3fe52ff7df93f7a928a15cc2cbf5134fdc0cec15 (diff) |
Add diagnostics for comma at end of enum and for extra semicolon at namespace
scope to -Wc++11-extensions. Move extra semicolon after member function
definition diagnostic out of -pedantic, since C++ allows a single semicolon
there. Keep it in -Wextra-semi, though, since it's still questionable.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160618 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/Misc/warning-flags.c | 6 | ||||
-rw-r--r-- | test/Parser/cxx-class.cpp | 6 | ||||
-rw-r--r-- | test/Parser/cxx-decl.cpp | 6 | ||||
-rw-r--r-- | test/Parser/cxx-extra-semi.cpp | 26 | ||||
-rw-r--r-- | test/Parser/cxx0x-decl.cpp | 13 |
5 files changed, 41 insertions, 16 deletions
diff --git a/test/Misc/warning-flags.c b/test/Misc/warning-flags.c index b661c6dd20..f7c23df093 100644 --- a/test/Misc/warning-flags.c +++ b/test/Misc/warning-flags.c @@ -150,8 +150,6 @@ CHECK-NEXT: warn_use_out_of_scope_declaration CHECK-NEXT: warn_weak_identifier_undeclared CHECK-NEXT: warn_weak_import -The list of warnings in -Wpedenatic should NEVER grow. - -CHECK: Number in -Wpedantic (not covered by other -W flags): 71 - +The list of warnings in -Wpedantic should NEVER grow. +CHECK: Number in -Wpedantic (not covered by other -W flags): 70 diff --git a/test/Parser/cxx-class.cpp b/test/Parser/cxx-class.cpp index 75e3fbacc4..feccba85cf 100644 --- a/test/Parser/cxx-class.cpp +++ b/test/Parser/cxx-class.cpp @@ -12,11 +12,15 @@ protected: int : 1, : 2; public: + void m0() {}; // ok, one extra ';' is permitted + void m1() {} + ; // ok, one extra ';' is permitted void m() { int l = 2; - }; // expected-warning{{extra ';' after function definition}} + };; // expected-warning{{extra ';' after member function definition}} template<typename T> void mt(T) { } + ; ; // expected-warning{{extra ';' inside a class}} virtual int vf() const volatile = 0; diff --git a/test/Parser/cxx-decl.cpp b/test/Parser/cxx-decl.cpp index 57f33d826f..951cd3dfd1 100644 --- a/test/Parser/cxx-decl.cpp +++ b/test/Parser/cxx-decl.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux %s +// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -pedantic %s int x(*g); // expected-error {{use of undeclared identifier 'g'}} @@ -44,7 +44,7 @@ class asm_class_test { void foo() __asm__("baz"); }; -enum { fooenum = 1 }; +enum { fooenum = 1, }; // expected-warning {{commas at the end of enumerator lists are a C++11 extension}} struct a { int Type : fooenum; @@ -125,5 +125,3 @@ test6a { ;// expected-error {{C++ requires a type specifier for all declarations // expected-error {{expected ';' after top level declarator}} int test6b; - - diff --git a/test/Parser/cxx-extra-semi.cpp b/test/Parser/cxx-extra-semi.cpp index 35c886b63b..2aa18dfcc0 100644 --- a/test/Parser/cxx-extra-semi.cpp +++ b/test/Parser/cxx-extra-semi.cpp @@ -1,13 +1,26 @@ +// RUN: %clang_cc1 -fsyntax-only -pedantic -verify -DPEDANTIC %s // RUN: %clang_cc1 -fsyntax-only -Wextra-semi -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wextra-semi -verify -std=c++11 %s // RUN: cp %s %t // RUN: %clang_cc1 -x c++ -Wextra-semi -fixit %t // RUN: %clang_cc1 -x c++ -Wextra-semi -Werror %t class A { void A1(); - void A2() { }; // expected-warning{{extra ';' after function definition}} + void A2() { }; +#ifndef PEDANTIC + // This warning is only produced if we specify -Wextra-semi, and not if only + // -pedantic is specified, since one semicolon is technically permitted. + // expected-warning@-4{{extra ';' after member function definition}} +#endif + void A2b() { };; // expected-warning{{extra ';' after member function definition}} ; // expected-warning{{extra ';' inside a class}} - void A3() { }; ;; // expected-warning{{extra ';' after function definition}} + void A2c() { } + ; +#ifndef PEDANTIC + // expected-warning@-2{{extra ';' after member function definition}} +#endif + void A3() { }; ;; // expected-warning{{extra ';' after member function definition}} ;;;;;;; // expected-warning{{extra ';' inside a class}} ; // expected-warning{{extra ';' inside a class}} ; ;; ; ;;; // expected-warning{{extra ';' inside a class}} @@ -20,6 +33,9 @@ union B { int a2;; // expected-warning{{extra ';' inside a union}} }; -; // expected-warning{{extra ';' outside of a function}} -; ;;// expected-warning{{extra ';' outside of a function}} - +; +; ;; +#if __cplusplus < 201103L +// expected-warning@-3{{extra ';' outside of a function is a C++11 extension}} +// expected-warning@-3{{extra ';' outside of a function is a C++11 extension}} +#endif diff --git a/test/Parser/cxx0x-decl.cpp b/test/Parser/cxx0x-decl.cpp index b9f5141a53..9a220caa5a 100644 --- a/test/Parser/cxx0x-decl.cpp +++ b/test/Parser/cxx0x-decl.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -verify -fsyntax-only -std=c++0x %s +// RUN: %clang_cc1 -verify -fsyntax-only -std=c++11 -pedantic %s // Make sure we know these are legitimate commas and not typos for ';'. namespace Commas { @@ -8,7 +8,7 @@ namespace Commas { } struct S {}; -enum E { e }; +enum E { e, }; auto f() -> struct S { return S(); @@ -16,3 +16,12 @@ auto f() -> struct S { auto g() -> enum E { return E(); } + +class ExtraSemiAfterMemFn { + // Due to a peculiarity in the C++11 grammar, a deleted or defaulted function + // is permitted to be followed by either one or two semicolons. + void f() = delete // expected-error {{expected ';' after delete}} + void g() = delete; // ok + void h() = delete;; // ok + void i() = delete;;; // expected-warning {{extra ';' after member function definition}} +}; |