diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticGroups.td | 2 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaCXX/old-style-cast.cpp | 11 |
4 files changed, 18 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index 38a939faae3..6de1a48d9f9 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -216,7 +216,7 @@ def NonPODVarargs : DiagGroup<"non-pod-varargs">; def : DiagGroup<"nonportable-cfstrings">; def NonVirtualDtor : DiagGroup<"non-virtual-dtor">; def OveralignedType : DiagGroup<"over-aligned">; -def : DiagGroup<"old-style-cast">; +def OldStyleCast : DiagGroup<"old-style-cast">; def : DiagGroup<"old-style-definition">; def OutOfLineDeclaration : DiagGroup<"out-of-line-declaration">; def : DiagGroup<"overflow">; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b8d99ba52cf..a314bf493a8 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2299,6 +2299,8 @@ def note_function_to_bool_call : Note< def warn_cast_align : Warning< "cast from %0 to %1 increases required alignment from %2 to %3">, InGroup<CastAlign>, DefaultIgnore; +def warn_old_style_cast : Warning< + "use of old-style cast">, InGroup<OldStyleCast>, DefaultIgnore; // Separate between casts to void* and non-void* pointers. // Some APIs use (abuse) void* for something like a user context, diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 55f9d6f8a08..b2bff51cd95 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -5138,6 +5138,10 @@ Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, CastExpr = Result.take(); } + if (getLangOpts().CPlusPlus && !castType->isVoidType()) + Diag(CastExpr->getLocStart(), diag::warn_old_style_cast) + << SourceRange(LParenLoc, RParenLoc); + return BuildCStyleCastExpr(LParenLoc, castTInfo, RParenLoc, CastExpr); } diff --git a/clang/test/SemaCXX/old-style-cast.cpp b/clang/test/SemaCXX/old-style-cast.cpp new file mode 100644 index 00000000000..d8198fcc567 --- /dev/null +++ b/clang/test/SemaCXX/old-style-cast.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wold-style-cast %s + +void test1() { + long x = (long)12; // expected-warning {{use of old-style cast}} + (long)x; // expected-warning {{use of old-style cast}} expected-warning {{expression result unused}} + (void**)x; // expected-warning {{use of old-style cast}} expected-warning {{expression result unused}} + long y = static_cast<long>(12); + (void)y; + typedef void VOID; + (VOID)y; +} |