From 41be673e93ed225b45479557b20ff19b3082bae8 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 14 Oct 2011 20:48:27 +0000 Subject: [PATCH] -Wc++98-compat: warn on C++11 attributes and alignas. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141999 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticParseKinds.td | 5 +++++ lib/Parse/ParseDeclCXX.cpp | 3 +++ test/SemaCXX/cxx98-compat.cpp | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index c083887584..73437b217b 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -371,6 +371,11 @@ def err_default_delete_in_multiple_declaration : Error< "'= %select{default|delete}0' is a function definition and must occur in a " "standalone declaration">; +def warn_cxx98_compat_alignas : Warning<"'alignas' is incompatible with C++98">, + InGroup, DefaultIgnore; +def warn_cxx98_compat_attribute : Warning< + "attributes are incompatible with C++98">, + InGroup, DefaultIgnore; def err_cxx0x_attribute_forbids_arguments : Error< "C++11 attribute '%0' cannot have an argument list">; def err_cxx0x_attribute_requires_arguments : Error< diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 607cb88260..4339047f1f 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -2622,6 +2622,7 @@ void Parser::PopParsingClass(Sema::ParsingClassState state) { void Parser::ParseCXX0XAttributeSpecifier(ParsedAttributes &attrs, SourceLocation *endLoc) { if (Tok.is(tok::kw_alignas)) { + Diag(Tok.getLocation(), diag::warn_cxx98_compat_alignas); ParseAlignmentSpecifier(attrs, endLoc); return; } @@ -2629,6 +2630,8 @@ void Parser::ParseCXX0XAttributeSpecifier(ParsedAttributes &attrs, assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square) && "Not a C++0x attribute list"); + Diag(Tok.getLocation(), diag::warn_cxx98_compat_attribute); + ConsumeBracket(); ConsumeBracket(); diff --git a/test/SemaCXX/cxx98-compat.cpp b/test/SemaCXX/cxx98-compat.cpp index 37815d4797..f3f323f5d4 100644 --- a/test/SemaCXX/cxx98-compat.cpp +++ b/test/SemaCXX/cxx98-compat.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -std=c++0x -Wc++98-compat -verify %s +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat -verify %s template // expected-warning {{variadic templates are incompatible with C++98}} class Variadic1 {}; @@ -8,3 +8,6 @@ class Variadic2 {}; template // expected-warning {{variadic templates are incompatible with C++98}} class Variadic3 {}; + +int alignas(8) with_alignas; // expected-warning {{'alignas' is incompatible with C++98}} +int with_attribute [[ ]]; // expected-warning {{attributes are incompatible with C++98}} -- 2.40.0