llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Amr Hesham (AmrDeveloper) <details> <summary>Changes</summary> Emitting an error message in case of implicit casting of a complex type to a built-in vector type in C --- Full diff: https://github.com/llvm/llvm-project/pull/187954.diff 4 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+2) - (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+2) - (modified) clang/lib/Sema/SemaChecking.cpp (+3) - (added) clang/test/Sema/implicit-cast-complex-to-vector.c (+11) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index b92f1ab34aa51..ce86c1de0ca2d 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -309,6 +309,8 @@ Improvements to Clang's diagnostics (``-fimplicit-module-maps``). This does not affect module maps specified explicitly via ``-fmodule-map-file=``. +- Clang now emits an error when implicitly casting a complex type to a built-in vector type. (#GH186805) + Improvements to Clang's time-trace ---------------------------------- diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index d4d09a8ecef36..baa052128bf94 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -4481,6 +4481,8 @@ def warn_impcast_float_result_precision : Warning< def warn_impcast_double_promotion : Warning< "implicit conversion increases floating-point precision: %0 to %1">, InGroup<DoublePromotion>, DefaultIgnore; +def err_impcast_incompatible_type : Error< + "implicit conversion from %0 to incompatible type %1">; def warn_impcast_integer_sign : Warning< "implicit conversion changes signedness: %0 to %1">, InGroup<SignConversion>, DefaultIgnore; diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 29add9d092e6b..c669a45a15024 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -13073,9 +13073,12 @@ void Sema::CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC, if (SourceMgr.isInSystemMacro(CC) || Target->isBooleanType()) return; + const Type *OriginalTargetTy = Context.getCanonicalType(T).getTypePtr(); return DiagnoseImpCast(*this, E, T, CC, getLangOpts().CPlusPlus ? diag::err_impcast_complex_scalar + : OriginalTargetTy->isVectorType() + ? diag::err_impcast_incompatible_type : diag::warn_impcast_complex_scalar); } diff --git a/clang/test/Sema/implicit-cast-complex-to-vector.c b/clang/test/Sema/implicit-cast-complex-to-vector.c new file mode 100644 index 0000000000000..a30bfb2d9dbd8 --- /dev/null +++ b/clang/test/Sema/implicit-cast-complex-to-vector.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +typedef char __attribute__((__vector_size__(64))) V; + +void implicit_cast_complex_to_vector() { + _Complex double x; + V y; + // expected-error@+1 {{implicit conversion from '_Complex double' to incompatible type 'V' (vector of 64 'char' values)}} + V z = x + y; +} + `````````` </details> https://github.com/llvm/llvm-project/pull/187954 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
