r253130 - [X86][MMX] Added MMX IR + assembly codegen builtin tests
Author: rksimon Date: Sat Nov 14 06:47:44 2015 New Revision: 253130 URL: http://llvm.org/viewvc/llvm-project?rev=253130&view=rev Log: [X86][MMX] Added MMX IR + assembly codegen builtin tests Improved tests as discussed in PR24580 Modified: cfe/trunk/test/CodeGen/mmx-builtins.c Modified: cfe/trunk/test/CodeGen/mmx-builtins.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mmx-builtins.c?rev=253130&r1=253129&r2=253130&view=diff == --- cfe/trunk/test/CodeGen/mmx-builtins.c (original) +++ cfe/trunk/test/CodeGen/mmx-builtins.c Sat Nov 14 06:47:44 2015 @@ -1,464 +1,626 @@ // REQUIRES: x86-registered-target -// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +ssse3 -S -o - | FileCheck %s -// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +ssse3 -fno-signed-char -S -o - | FileCheck %s +// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +ssse3 -emit-llvm -o - -Werror | FileCheck %s +// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +ssse3 -fno-signed-char -emit-llvm -o - -Werror | FileCheck %s +// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +ssse3 -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM +// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +ssse3 -fno-signed-char -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM -// FIXME: Disable inclusion of mm_malloc.h, our current implementation is broken -// on win32 since we don't generally know how to find errno.h. +// Don't include mm_malloc.h, it's system specific. #define __MM_MALLOC_H -#include +#include -__m64 test1(__m64 a, __m64 b) { - // CHECK: phaddw +__m64 test_mm_hadd_pi16(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_hadd_pi16 + // CHECK: call x86_mmx @llvm.x86.ssse3.phadd.w + // CHECK-ASM: phaddw %mm{{.*}}, %mm{{.*}} return _mm_hadd_pi16(a, b); } -__m64 test2(__m64 a, __m64 b) { - // CHECK: phaddd +__m64 test_mm_hadd_pi32(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_hadd_pi32 + // CHECK: call x86_mmx @llvm.x86.ssse3.phadd.d + // CHECK-ASM: phaddd %mm{{.*}}, %mm{{.*}} return _mm_hadd_pi32(a, b); } -__m64 test3(__m64 a, __m64 b) { - // CHECK: phaddsw +__m64 test_mm_hadds_pi16(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_hadds_pi16 + // CHECK: call x86_mmx @llvm.x86.ssse3.phadd.sw + // CHECK-ASM: phaddsw %mm{{.*}}, %mm{{.*}} return _mm_hadds_pi16(a, b); } -__m64 test4(__m64 a, __m64 b) { - // CHECK: phsubw +__m64 test_mm_hsub_pi16(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_hsub_pi16 + // CHECK: call x86_mmx @llvm.x86.ssse3.phsub.w + // CHECK-ASM: phsubw %mm{{.*}}, %mm{{.*}} return _mm_hsub_pi16(a, b); } -__m64 test5(__m64 a, __m64 b) { - // CHECK: phsubd +__m64 test_mm_hsub_pi32(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_hsub_pi32 + // CHECK: call x86_mmx @llvm.x86.ssse3.phsub.d + // CHECK-ASM: phsubd %mm{{.*}}, %mm{{.*}} return _mm_hsub_pi32(a, b); } -__m64 test6(__m64 a, __m64 b) { - // CHECK: phsubsw +__m64 test_mm_hsubs_pi16(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_hsubs_pi16 + // CHECK: call x86_mmx @llvm.x86.ssse3.phsub.sw + // CHECK-ASM: phsubsw %mm{{.*}}, %mm{{.*}} return _mm_hsubs_pi16(a, b); } -__m64 test7(__m64 a, __m64 b) { - // CHECK: pmaddubsw +__m64 test_mm_maddubs_pi16(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_maddubs_pi16 + // CHECK: call x86_mmx @llvm.x86.ssse3.pmadd.ub.sw + // CHECK-ASM: pmaddubsw %mm{{.*}}, %mm{{.*}} return _mm_maddubs_pi16(a, b); } -__m64 test8(__m64 a, __m64 b) { - // CHECK: pmulhrsw +__m64 test_mm_mulhrs_pi16(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_mulhrs_pi16 + // CHECK: call x86_mmx @llvm.x86.ssse3.pmul.hr.sw + // CHECK-ASM: pmulhrsw %mm{{.*}}, %mm{{.*}} return _mm_mulhrs_pi16(a, b); } -__m64 test9(__m64 a, __m64 b) { - // CHECK: pshufb +__m64 test_mm_shuffle_pi8(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_shuffle_pi8 + // CHECK: call x86_mmx @llvm.x86.ssse3.pshuf.b + // CHECK-ASM: pshufb %mm{{.*}}, %mm{{.*}} return _mm_shuffle_pi8(a, b); } -__m64 test10(__m64 a, __m64 b) { - // CHECK: psignb +__m64 test_mm_sign_pi8(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_sign_pi8 + // CHECK: call x86_mmx @llvm.x86.ssse3.psign.b + // CHECK-ASM: psignb %mm{{.*}}, %mm{{.*}} return _mm_sign_pi8(a, b); } -__m64 test11(__m64 a, __m64 b) { - // CHECK: psignw +__m64 test_mm_sign_pi16(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_sign_pi16 + // CHECK: call x86_mmx @llvm.x86.ssse3.psign.w + // CHECK-ASM: psignw %mm{{.*}}, %mm{{.*}} return _mm_sign_pi16(a, b); } -__m64 test12(__m64 a, __m64 b) { - // CHECK: psignd +__m64 test_mm_sign_pi32(__m64 a, __m64 b) { + // CHECK-LABEL: test_mm_sign_pi32 + // CHECK: call x86_mmx @llvm.x86.ssse3.psign.d + // CHECK-ASM: psignd %mm{{.*}}, %mm{{.*}} return _mm_sign_pi32(a, b); } -__m64 test13(__m64 a) { - // CHECK: pabsb +__m64 test_mm_
r253131 - [X86][MMX] Sorted MMX IR + assembly codegen builtin tests
Author: rksimon Date: Sat Nov 14 07:25:06 2015 New Revision: 253131 URL: http://llvm.org/viewvc/llvm-project?rev=253131&view=rev Log: [X86][MMX] Sorted MMX IR + assembly codegen builtin tests Makes it easier to track what tests are missing Modified: cfe/trunk/test/CodeGen/mmx-builtins.c Modified: cfe/trunk/test/CodeGen/mmx-builtins.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mmx-builtins.c?rev=253131&r1=253130&r2=253131&view=diff == --- cfe/trunk/test/CodeGen/mmx-builtins.c (original) +++ cfe/trunk/test/CodeGen/mmx-builtins.c Sat Nov 14 07:25:06 2015 @@ -9,90 +9,6 @@ #include -__m64 test_mm_hadd_pi16(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_hadd_pi16 - // CHECK: call x86_mmx @llvm.x86.ssse3.phadd.w - // CHECK-ASM: phaddw %mm{{.*}}, %mm{{.*}} - return _mm_hadd_pi16(a, b); -} - -__m64 test_mm_hadd_pi32(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_hadd_pi32 - // CHECK: call x86_mmx @llvm.x86.ssse3.phadd.d - // CHECK-ASM: phaddd %mm{{.*}}, %mm{{.*}} - return _mm_hadd_pi32(a, b); -} - -__m64 test_mm_hadds_pi16(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_hadds_pi16 - // CHECK: call x86_mmx @llvm.x86.ssse3.phadd.sw - // CHECK-ASM: phaddsw %mm{{.*}}, %mm{{.*}} - return _mm_hadds_pi16(a, b); -} - -__m64 test_mm_hsub_pi16(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_hsub_pi16 - // CHECK: call x86_mmx @llvm.x86.ssse3.phsub.w - // CHECK-ASM: phsubw %mm{{.*}}, %mm{{.*}} - return _mm_hsub_pi16(a, b); -} - -__m64 test_mm_hsub_pi32(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_hsub_pi32 - // CHECK: call x86_mmx @llvm.x86.ssse3.phsub.d - // CHECK-ASM: phsubd %mm{{.*}}, %mm{{.*}} - return _mm_hsub_pi32(a, b); -} - -__m64 test_mm_hsubs_pi16(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_hsubs_pi16 - // CHECK: call x86_mmx @llvm.x86.ssse3.phsub.sw - // CHECK-ASM: phsubsw %mm{{.*}}, %mm{{.*}} - return _mm_hsubs_pi16(a, b); -} - -__m64 test_mm_maddubs_pi16(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_maddubs_pi16 - // CHECK: call x86_mmx @llvm.x86.ssse3.pmadd.ub.sw - // CHECK-ASM: pmaddubsw %mm{{.*}}, %mm{{.*}} - return _mm_maddubs_pi16(a, b); -} - -__m64 test_mm_mulhrs_pi16(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_mulhrs_pi16 - // CHECK: call x86_mmx @llvm.x86.ssse3.pmul.hr.sw - // CHECK-ASM: pmulhrsw %mm{{.*}}, %mm{{.*}} - return _mm_mulhrs_pi16(a, b); -} - -__m64 test_mm_shuffle_pi8(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_shuffle_pi8 - // CHECK: call x86_mmx @llvm.x86.ssse3.pshuf.b - // CHECK-ASM: pshufb %mm{{.*}}, %mm{{.*}} - return _mm_shuffle_pi8(a, b); -} - -__m64 test_mm_sign_pi8(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_sign_pi8 - // CHECK: call x86_mmx @llvm.x86.ssse3.psign.b - // CHECK-ASM: psignb %mm{{.*}}, %mm{{.*}} - return _mm_sign_pi8(a, b); -} - -__m64 test_mm_sign_pi16(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_sign_pi16 - // CHECK: call x86_mmx @llvm.x86.ssse3.psign.w - // CHECK-ASM: psignw %mm{{.*}}, %mm{{.*}} - return _mm_sign_pi16(a, b); -} - -__m64 test_mm_sign_pi32(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_sign_pi32 - // CHECK: call x86_mmx @llvm.x86.ssse3.psign.d - // CHECK-ASM: psignd %mm{{.*}}, %mm{{.*}} - return _mm_sign_pi32(a, b); -} - __m64 test_mm_abs_pi8(__m64 a) { // CHECK-LABEL: test_mm_abs_pi8 // CHECK: call x86_mmx @llvm.x86.ssse3.pabs.b @@ -114,111 +30,6 @@ __m64 test_mm_abs_pi32(__m64 a) { return _mm_abs_pi32(a); } -__m64 test_mm_alignr_pi8(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_alignr_pi8 - // CHECK: call x86_mmx @llvm.x86.mmx.palignr.b - // CHECK-ASM: palignr $2, %mm{{.*}}, %mm{{.*}} - return _mm_alignr_pi8(a, b, 2); -} - -__m64 test_mm_cvtpd_pi32(__m128d a) { - // CHECK-LABEL: test_mm_cvtpd_pi32 - // CHECK: call x86_mmx @llvm.x86.sse.cvtpd2pi - // CHECK-ASM: cvtpd2pi %xmm{{.*}}, %mm{{.*}} - return _mm_cvtpd_pi32(a); -} - -__m64 test_mm_cvttpd_pi32(__m128d a) { - // CHECK-LABEL: test_mm_cvttpd_pi32 - // CHECK: call x86_mmx @llvm.x86.sse.cvttpd2pi - // CHECK-ASM: cvttpd2pi %xmm{{.*}}, %mm{{.*}} - return _mm_cvttpd_pi32(a); -} - -__m128d test_mm_cvtpi32_pd(__m64 a) { - // CHECK-LABEL: test_mm_cvtpi32_pd - // CHECK: call <2 x double> @llvm.x86.sse.cvtpi2pd - // CHECK-ASM: cvtpi2pd %mm{{.*}}, %xmm{{.*}} - return _mm_cvtpi32_pd(a); -} - -__m64 test_mm_mul_su32(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_mul_su32 - // CHECK: call x86_mmx @llvm.x86.mmx.pmulu.dq - // CHECK-ASM: pmuludq %mm{{.*}}, %mm{{.*}} - return _mm_mul_su32(a, b); -} - -__m64 test_mm_shuffle_pi16(__m64 a) { - // CHECK-LABEL: test_mm_shuffle_pi16 - // CHECK: call x86_mmx @llvm.x86.sse.pshuf.w - // CHECK-ASM: pshufw $3, %mm{{.*}}, %mm{{.*}} - return _mm_shuffle_pi16(a, 3); -} - -__m64 test_mm_mulhi_pu16(__m64 a, __m64 b) { - // CHECK-LABEL: test_mm_mulhi_pu16 - // CHECK: call x86_mmx @llvm.x86.mmx.pmulhu.w - // CHECK-ASM: pmulhuw %mm{{.*}}, %mm{{.*}} - return _mm_mulhi_pu16(a, b); -} -
Re: [PATCH] D13388: Add support for querying the visibility of a cursor
milianw accepted this revision. milianw added a comment. This revision is now accepted and ready to land. From my POV, this looks good. http://reviews.llvm.org/D13388 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: r242121 - Add support for -fuse-ld= in the mingw toolchain driver.
Handling of values other than lld looked weird. Can you make it a hard error to use something other than, I guess, ld, gold, lld? Or are there other linkers available? Filipe On Friday, 13 November 2015, Yaron Keren via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Sure, r253066. > > > 2015-11-13 19:40 GMT+02:00 Rafael Espíndola >: > >> This needs a testcase. Nothing is checking the linker invocation. >> >> On 14 July 2015 at 01:23, Yaron Keren > > wrote: >> > Author: yrnkrn >> > Date: Tue Jul 14 00:23:34 2015 >> > New Revision: 242121 >> > >> > URL: http://llvm.org/viewvc/llvm-project?rev=242121&view=rev >> > Log: >> > Add support for -fuse-ld= in the mingw toolchain driver. >> > We will still default to ld until such a time lld become a >> > stable release. lld supports arm NT under the machine name "thumb2pe". >> > >> > http://reviews.llvm.org/D11088 >> > >> > Patch by Martell Malone >> > Reviewed by Reid Kleckner >> > >> > >> > Modified: >> > cfe/trunk/lib/Driver/Tools.cpp >> > >> > Modified: cfe/trunk/lib/Driver/Tools.cpp >> > URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=242121&r1=242120&r2=242121&view=diff >> > >> == >> > --- cfe/trunk/lib/Driver/Tools.cpp (original) >> > +++ cfe/trunk/lib/Driver/Tools.cpp Tue Jul 14 00:23:34 2015 >> > @@ -8947,6 +8947,12 @@ void MinGW::Linker::ConstructJob(Compila >> >// handled somewhere else. >> >Args.ClaimAllArgs(options::OPT_w); >> > >> > + StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, >> "ld"); >> > + if (LinkerName.equals_lower("lld")) { >> > +CmdArgs.push_back("-flavor"); >> > +CmdArgs.push_back("gnu"); >> > + } >> > + >> >if (!D.SysRoot.empty()) >> > CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); >> > >> > @@ -8958,6 +8964,8 @@ void MinGW::Linker::ConstructJob(Compila >> > CmdArgs.push_back("i386pe"); >> >if (TC.getArch() == llvm::Triple::x86_64) >> > CmdArgs.push_back("i386pep"); >> > + if (TC.getArch() == llvm::Triple::arm) >> > +CmdArgs.push_back("thumb2pe"); >> > >> >if (Args.hasArg(options::OPT_mwindows)) { >> > CmdArgs.push_back("--subsystem"); >> > @@ -9067,7 +9075,7 @@ void MinGW::Linker::ConstructJob(Compila >> > >> >if (Args.hasArg(options::OPT_static)) >> > CmdArgs.push_back("--end-group"); >> > - else >> > + else if (!LinkerName.equals_lower("lld")) >> > AddLibGCC(Args, CmdArgs); >> > } >> > >> > @@ -9078,7 +9086,7 @@ void MinGW::Linker::ConstructJob(Compila >> > >> CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o"))); >> > } >> >} >> > - const char *Exec = Args.MakeArgString(TC.GetProgramPath("ld")); >> > + const char *Exec = >> Args.MakeArgString(TC.GetProgramPath(LinkerName.data())); >> >C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs)); >> > } >> > >> > >> > >> > ___ >> > cfe-commits mailing list >> > cfe-comm...@cs.uiuc.edu >> >> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > -- F ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: r242121 - Add support for -fuse-ld= in the mingw toolchain driver.
On 15 November 2015 at 02:39, Filipe Cabecinhas wrote: > Handling of values other than lld looked weird. > Can you make it a hard error to use something other than, I guess, ld, gold, > lld? > Or are there other linkers available? What I find strange is that we use -flavor at all. We should ideally just be using different links to lld, like we do with "-fuse-ld=lld2". Cheers, Rafael ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253133 - Fix spelling error in comment.
Author: ctopper Date: Sat Nov 14 12:15:55 2015 New Revision: 253133 URL: http://llvm.org/viewvc/llvm-project?rev=253133&view=rev Log: Fix spelling error in comment. Modified: cfe/trunk/lib/Parse/ParseDecl.cpp Modified: cfe/trunk/lib/Parse/ParseDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=253133&r1=253132&r2=253133&view=diff == --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) +++ cfe/trunk/lib/Parse/ParseDecl.cpp Sat Nov 14 12:15:55 2015 @@ -2157,7 +2157,7 @@ void Parser::ParseSpecifierQualifierList DS.ClearStorageClassSpecs(); } - // Issue diagnostic and remove function specfier if present. + // Issue diagnostic and remove function specifier if present. if (Specs & DeclSpec::PQ_FunctionSpecifier) { if (DS.isInlineSpecified()) Diag(DS.getInlineSpecLoc(), diag::err_typename_invalid_functionspec); ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253136 - Merge some similar diagnostics using %select.
Author: ctopper Date: Sat Nov 14 12:16:08 2015 New Revision: 253136 URL: http://llvm.org/viewvc/llvm-project?rev=253136&view=rev Log: Merge some similar diagnostics using %select. Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp cfe/trunk/lib/Parse/ParseDecl.cpp cfe/trunk/lib/Parse/ParseDeclCXX.cpp cfe/trunk/lib/Parse/Parser.cpp cfe/trunk/lib/Sema/DeclSpec.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=253136&r1=253135&r2=253136&view=diff == --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Sat Nov 14 12:16:08 2015 @@ -71,9 +71,8 @@ def ext_nullability : Extension< def error_empty_enum : Error<"use of empty enum">; def err_invalid_sign_spec : Error<"'%0' cannot be signed or unsigned">; -def err_invalid_short_spec : Error<"'short %0' is invalid">; -def err_invalid_long_spec : Error<"'long %0' is invalid">; -def err_invalid_longlong_spec : Error<"'long long %0' is invalid">; +def err_invalid_width_spec : Error< + "'%select{|short|long|long long}0 %1' is invalid">; def err_invalid_complex_spec : Error<"'_Complex %0' is invalid">; def err_friend_decl_spec : Error<"'%0' is invalid in friend declarations">; @@ -380,10 +379,8 @@ def err_friend_invalid_in_context : Erro "'friend' used outside of class">; def err_use_of_tag_name_without_tag : Error< "must use '%1' tag to refer to type %0%select{| in this scope}2">; -def err_templated_using_directive : Error< - "cannot template a using directive">; -def err_templated_using_declaration : Error< - "cannot template a using declaration">; +def err_templated_using_directive_declaration : Error< + "cannot template a using %select{directive|declaration}0">; def err_unexpected_colon_in_nested_name_spec : Error< "unexpected ':' in nested name specifier; did you mean '::'?">; def err_unexpected_token_in_nested_name_spec : Error< @@ -698,12 +695,9 @@ def warn_static_inline_explicit_inst_ign // Constructor template diagnostics. def err_out_of_line_constructor_template_id : Error< "out-of-line constructor for %0 cannot have template arguments">; -def err_out_of_line_template_id_names_constructor : Error< +def err_out_of_line_template_id_type_names_constructor : Error< "qualified reference to %0 is a constructor name rather than a " - "template name wherever a constructor can be declared">; -def err_out_of_line_type_names_constructor : Error< - "qualified reference to %0 is a constructor name rather than a " - "type wherever a constructor can be declared">; + "%select{template name|type}1 wherever a constructor can be declared">; def err_expected_qualified_after_typename : Error< "expected a qualified name after 'typename'">; @@ -743,15 +737,11 @@ def err_missing_whitespace_digraph : Err "%select{template name|const_cast|dynamic_cast|reinterpret_cast|static_cast}0" " which forms the digraph '<:' (aka '[') and a ':', did you mean '< ::'?">; -def ext_deleted_function : ExtWarn< - "deleted function definitions are a C++11 extension">, InGroup; -def warn_cxx98_compat_deleted_function : Warning< - "deleted function definitions are incompatible with C++98">, - InGroup, DefaultIgnore; -def ext_defaulted_function : ExtWarn< - "defaulted function definitions are a C++11 extension">, InGroup; -def warn_cxx98_compat_defaulted_function : Warning< - "defaulted function definitions are incompatible with C++98">, +def ext_defaulted_deleted_function : ExtWarn< + "%select{defaulted|deleted}0 function definitions are a C++11 extension">, + InGroup; +def warn_cxx98_compat_defaulted_deleted_function : Warning< + "%select{defaulted|deleted}0 function definitions are incompatible with C++98">, InGroup, DefaultIgnore; // C++11 in-class member initialization Modified: cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp?rev=253136&r1=253135&r2=253136&view=diff == --- cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp (original) +++ cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp Sat Nov 14 12:16:08 2015 @@ -67,8 +67,9 @@ NamedDecl *Parser::ParseCXXInlineMethodD SourceLocation KWEndLoc = Tok.getEndLoc().getLocWithOffset(-1); if (TryConsumeToken(tok::kw_delete, KWLoc)) { Diag(KWLoc, getLangOpts().CPlusPlus11 - ? diag::warn_cxx98_compat_deleted_function - : diag::ext_deleted_function); + ? diag::warn_cxx98_compat_defaulted_deleted_function + : diag::ext_defaulted_deleted_function) +<< 1 /* deleted */; Actions.SetDeclDeleted
r253134 - Fix 80 column violation. NFC.
Author: ctopper Date: Sat Nov 14 12:16:00 2015 New Revision: 253134 URL: http://llvm.org/viewvc/llvm-project?rev=253134&view=rev Log: Fix 80 column violation. NFC. Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=253134&r1=253133&r2=253134&view=diff == --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original) +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Sat Nov 14 12:16:00 2015 @@ -280,8 +280,8 @@ Decl *Parser::ParseNamespaceAlias(Source if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after_namespace_name)) SkipUntil(tok::semi); - return Actions.ActOnNamespaceAliasDef(getCurScope(), NamespaceLoc, AliasLoc, Alias, -SS, IdentLoc, Ident); + return Actions.ActOnNamespaceAliasDef(getCurScope(), NamespaceLoc, AliasLoc, +Alias, SS, IdentLoc, Ident); } /// ParseLinkage - We know that the current token is a string_literal ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253135 - Minor formatting fixes. NFC
Author: ctopper Date: Sat Nov 14 12:16:02 2015 New Revision: 253135 URL: http://llvm.org/viewvc/llvm-project?rev=253135&view=rev Log: Minor formatting fixes. NFC Modified: cfe/trunk/lib/Parse/ParseObjc.cpp Modified: cfe/trunk/lib/Parse/ParseObjc.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=253135&r1=253134&r2=253135&view=diff == --- cfe/trunk/lib/Parse/ParseObjc.cpp (original) +++ cfe/trunk/lib/Parse/ParseObjc.cpp Sat Nov 14 12:16:02 2015 @@ -916,7 +916,7 @@ void Parser::ParseObjCPropertyAttribute( // getter/setter require extra treatment. unsigned DiagID = IsSetter ? diag::err_objc_expected_equal_for_setter : -diag::err_objc_expected_equal_for_getter; + diag::err_objc_expected_equal_for_getter; if (ExpectAndConsume(tok::equal, DiagID)) { SkipUntil(tok::r_paren, StopAtSemi); @@ -931,7 +931,6 @@ void Parser::ParseObjCPropertyAttribute( return cutOffParsing(); } - SourceLocation SelLoc; IdentifierInfo *SelIdent = ParseObjCSelectorPiece(SelLoc); ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253142 - Fix indentation. NFC
Author: ctopper Date: Sat Nov 14 13:31:52 2015 New Revision: 253142 URL: http://llvm.org/viewvc/llvm-project?rev=253142&view=rev Log: Fix indentation. NFC Modified: cfe/trunk/lib/Sema/DeclSpec.cpp Modified: cfe/trunk/lib/Sema/DeclSpec.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/DeclSpec.cpp?rev=253142&r1=253141&r2=253142&view=diff == --- cfe/trunk/lib/Sema/DeclSpec.cpp (original) +++ cfe/trunk/lib/Sema/DeclSpec.cpp Sat Nov 14 13:31:52 2015 @@ -516,12 +516,12 @@ bool DeclSpec::SetStorageClassSpec(Sema case SCS_extern: case SCS_private_extern: case SCS_static: -if (S.getLangOpts().OpenCLVersion < 120) { - DiagID = diag::err_opencl_unknown_type_specifier; - PrevSpec = getSpecifierName(SC); - return true; -} -break; + if (S.getLangOpts().OpenCLVersion < 120) { +DiagID = diag::err_opencl_unknown_type_specifier; +PrevSpec = getSpecifierName(SC); +return true; + } + break; case SCS_auto: case SCS_register: DiagID = diag::err_opencl_unknown_type_specifier; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253143 - Move diagnostics from Parse to Sema to remove Sema's dependency on ParserDiagnostic.h diagnostics.
Author: ctopper Date: Sat Nov 14 13:31:56 2015 New Revision: 253143 URL: http://llvm.org/viewvc/llvm-project?rev=253143&view=rev Log: Move diagnostics from Parse to Sema to remove Sema's dependency on ParserDiagnostic.h diagnostics. Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Parse/ParseDecl.cpp cfe/trunk/lib/Sema/DeclSpec.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/lib/Sema/SemaType.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=253143&r1=253142&r2=253143&view=diff == --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Sat Nov 14 13:31:56 2015 @@ -51,14 +51,6 @@ def warn_extra_semi_after_mem_fn_def : W "extra ';' after member function definition">, InGroup, DefaultIgnore; -def ext_duplicate_declspec : ExtWarn<"duplicate '%0' declaration specifier">, - InGroup; -def warn_duplicate_declspec : Warning<"duplicate '%0' declaration specifier">, - InGroup; -def ext_plain_complex : ExtWarn< - "plain '_Complex' requires a type specifier; assuming '_Complex double'">; -def ext_integer_complex : Extension< - "complex integer types are a GNU extension">, InGroup; def ext_thread_before : Extension<"'__thread' before '%0'">; def ext_keyword_as_ident : ExtWarn< "keyword '%0' will be made available as an identifier " @@ -70,11 +62,6 @@ def ext_nullability : Extension< InGroup>; def error_empty_enum : Error<"use of empty enum">; -def err_invalid_sign_spec : Error<"'%0' cannot be signed or unsigned">; -def err_invalid_width_spec : Error< - "'%select{|short|long|long long}0 %1' is invalid">; -def err_invalid_complex_spec : Error<"'_Complex %0' is invalid">; -def err_friend_decl_spec : Error<"'%0' is invalid in friend declarations">; def ext_ident_list_in_param : Extension< "type-less parameter names in function declaration">; @@ -285,11 +272,6 @@ def err_init_list_bin_op : Error<"initia def warn_cxx98_compat_trailing_return_type : Warning< "trailing return types are incompatible with C++98">, InGroup, DefaultIgnore; -def ext_auto_type_specifier : ExtWarn< - "'auto' type specifier is a C++11 extension">, InGroup; -def warn_auto_storage_class : Warning< - "'auto' storage class specifier is redundant and incompatible with C++11">, - InGroup, DefaultIgnore; def ext_auto_storage_class : ExtWarn< "'auto' storage class specifier is not permitted in C++11, and will not " "be supported in future releases">, InGroup>; @@ -329,9 +311,6 @@ def err_unspecified_vla_size_with_static "'static' may not be used with an unspecified variable length array size">; def err_unspecified_size_with_static : Error< "'static' may not be used without an array size">; -def warn_deprecated_register : Warning< - "'register' storage class specifier is deprecated">, - InGroup; def err_expected_parentheses_around_typename : Error< "expected parentheses around type name in %0 expression">; @@ -350,35 +329,8 @@ def err_typename_invalid_constexpr : Err def err_typename_identifiers_only : Error< "typename is allowed for identifiers only">; -def err_invalid_decl_spec_combination : Error< - "cannot combine with previous '%0' declaration specifier">; -def err_invalid_vector_decl_spec_combination : Error< - "cannot combine with previous '%0' declaration specifier. " - "'__vector' must be first">; -def err_invalid_pixel_decl_spec_combination : Error< - "'__pixel' must be preceded by '__vector'. " - "'%0' declaration specifier not allowed here">; -def err_invalid_vector_bool_decl_spec : Error< - "cannot use '%0' with '__vector bool'">; -def err_invalid_vector_long_decl_spec : Error< - "cannot use 'long' with '__vector'">; -def err_invalid_vector_float_decl_spec : Error< - "cannot use 'float' with '__vector'">; -def err_invalid_vector_double_decl_spec : Error < - "use of 'double' with '__vector' requires VSX support to be enabled " - "(available on POWER7 or later)">; -def err_invalid_vector_long_long_decl_spec : Error < - "use of 'long long' with '__vector bool' requires VSX support (available on " - "POWER7 or later) or extended Altivec support (available on POWER8 or later) " - "to be enabled">; -def err_invalid_vector_long_double_decl_spec : Error< - "cannot use 'long double' with '__vector'">; -def warn_vector_long_decl_spec_combination : Warning< - "Use of 'long' with '__vector' is deprecated">, InGroup; def err_friend_invalid_in_context : Error< "'friend' used outside of class">; -def err_use_of_tag_name_without_tag : Error< - "must use '%1' tag to refer to type %0%select{| in this scope}2">; def err_templated_using_directive_declaration : Error< "cannot template a using %select{directiv
Re: r242121 - Add support for -fuse-ld= in the mingw toolchain driver.
Filipe: with mingw targetting Windows/COFF files I think only ld and lld makes sense as gold creates ELF files. I included Microsoft link.exe in the mingw-useld test but rethinking, no one really uses that configuration, see attached patch. Is that what you mean? Rafael: running under Windows which has symbolic links but they aren't really used as much (or at all) as under Linux. For example clang-cl.exe and clang++.exe are copies (not links) of clang.exe. Martell, what do you think? 2015-11-14 19:52 GMT+02:00 Rafael Espíndola : > On 15 November 2015 at 02:39, Filipe Cabecinhas wrote: > > Handling of values other than lld looked weird. > > Can you make it a hard error to use something other than, I guess, ld, > gold, > > lld? > > Or are there other linkers available? > > What I find strange is that we use -flavor at all. We should ideally > just be using different links to lld, like we do with "-fuse-ld=lld2". > > > Cheers, > Rafael > Index: tools/clang/lib/Driver/Tools.cpp === --- tools/clang/lib/Driver/Tools.cpp(revision 253024) +++ tools/clang/lib/Driver/Tools.cpp(working copy) @@ -9470,6 +9470,8 @@ if (LinkerName.equals_lower("lld")) { CmdArgs.push_back("-flavor"); CmdArgs.push_back("gnu"); + } else if (!LinkerName.equals_lower("ld")) { +D.Diag(diag::err_drv_unsupported_linker) << LinkerName; } if (!D.SysRoot.empty()) Index: tools/clang/test/Driver/mingw-useld.c === --- tools/clang/test/Driver/mingw-useld.c (revision 253069) +++ tools/clang/test/Driver/mingw-useld.c (working copy) @@ -7,10 +7,6 @@ // CHECK_LLD_32: lld" "-flavor" "gnu" // CHECK_LLD_32: "i386pe" -// RUN: %clang -### -target i686-pc-windows-gnu --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -fuse-ld=link.exe 2>&1 | FileCheck -check-prefix=CHECK_LINK_32 %s -// CHECK_LINK_32: link.exe" -// CHECK_LINK_32: "i386pe" - // RUN: %clang -### -target x86_64-pc-windows-gnu --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -fuse-ld=lld 2>&1 | FileCheck -check-prefix=CHECK_LLD_64 %s // CHECK_LLD_64: lld" "-flavor" "gnu" // CHECK_LLD_64: "i386pep" ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: r242121 - Add support for -fuse-ld= in the mingw toolchain driver.
The reason why I didn't use -fuse-ld=lld2 was because on Windows we don't have symlinks. I figured passing flavor gets over this hurdle and the installation takes up less space. If you want to change it I have no objections we will just have to look at having lld's cmake to ensure it is created on Windows like we do for clang++ The idea of forcing either lld or ld LGTM yaron. I don't think using MSVC link.exe makes any sense to mingw users. On Saturday, November 14, 2015, Yaron Keren wrote: > Filipe: with mingw targetting Windows/COFF files I think only ld and lld > makes sense as gold creates ELF files. I included Microsoft link.exe in the > mingw-useld test but rethinking, no one really uses that configuration, see > attached patch. Is that what you mean? > > Rafael: running under Windows which has symbolic links but they aren't > really used as much (or at all) as under Linux. For example clang-cl.exe > and clang++.exe are copies (not links) of clang.exe. > > Martell, what do you think? > > > > 2015-11-14 19:52 GMT+02:00 Rafael Espíndola >: > >> On 15 November 2015 at 02:39, Filipe Cabecinhas > > wrote: >> > Handling of values other than lld looked weird. >> > Can you make it a hard error to use something other than, I guess, ld, >> gold, >> > lld? >> > Or are there other linkers available? >> >> What I find strange is that we use -flavor at all. We should ideally >> just be using different links to lld, like we do with "-fuse-ld=lld2". >> >> >> Cheers, >> Rafael >> > > ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: r253012 - [modules] When a declaration has non-trivial visibility, check whether it's
On Nov 13, 2015 7:23 PM, "Sean Silva" wrote: > > > > On Thu, Nov 12, 2015 at 9:14 PM, Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote: >> >> Author: rsmith >> Date: Thu Nov 12 23:14:45 2015 >> New Revision: 253012 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=253012&view=rev >> Log: >> [modules] When a declaration has non-trivial visibility, check whether it's > > > What is "non-trivial visibility"? Is this "visibility" something that exists in the present C++ language? (e.g. `using namespace std` etc.) or is this a different notion? This is the modules notion of visibility (whether the declaration has been imported or not). Here, non-trivial visibility means "not known to be unconditionally visible", and corresponds to the Hidden flag on the Decl being true. > -- Sean Silva > >> >> actually hidden before we check its linkage. This avoids computing the linkage >> "too early" for an anonymous struct with a typedef name for linkage. >> >> Modified: >> cfe/trunk/include/clang/Sema/Lookup.h >> cfe/trunk/test/Modules/submodule-visibility.cpp >> >> Modified: cfe/trunk/include/clang/Sema/Lookup.h >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Lookup.h?rev=253012&r1=253011&r2=253012&view=diff >> == >> --- cfe/trunk/include/clang/Sema/Lookup.h (original) >> +++ cfe/trunk/include/clang/Sema/Lookup.h Thu Nov 12 23:14:45 2015 >> @@ -303,8 +303,7 @@ public: >> if (!D->isInIdentifierNamespace(IDNS)) >>return nullptr; >> >> -if (!D->isHidden() || isHiddenDeclarationVisible(D) || >> -isVisibleSlow(getSema(), D)) >> +if (isVisible(getSema(), D) || isHiddenDeclarationVisible(D)) >>return D; >> >> return getAcceptableDeclSlow(D); >> >> Modified: cfe/trunk/test/Modules/submodule-visibility.cpp >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodule-visibility.cpp?rev=253012&r1=253011&r2=253012&view=diff >> == >> --- cfe/trunk/test/Modules/submodule-visibility.cpp (original) >> +++ cfe/trunk/test/Modules/submodule-visibility.cpp Thu Nov 12 23:14:45 2015 >> @@ -28,3 +28,10 @@ int k = n + m; // OK, a and b are visibl >> #ifndef B >> #error B is not defined >> #endif >> + >> +// Ensure we don't compute the linkage of this struct before we find it has a >> +// typedef name for linkage purposes. >> +typedef struct { >> + int p; >> + void (*f)(int p); >> +} name_for_linkage; >> >> >> ___ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253146 - [WebAssembly] Remove the "const" attribute from __builtin_wasm_memory_size.
Author: djg Date: Sat Nov 14 16:57:34 2015 New Revision: 253146 URL: http://llvm.org/viewvc/llvm-project?rev=253146&view=rev Log: [WebAssembly] Remove the "const" attribute from __builtin_wasm_memory_size. Modified: cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def Modified: cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def?rev=253146&r1=253145&r2=253146&view=diff == --- cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def (original) +++ cfe/trunk/include/clang/Basic/BuiltinsWebAssembly.def Sat Nov 14 16:57:34 2015 @@ -16,7 +16,9 @@ // The format of this database matches clang/Basic/Builtins.def. -BUILTIN(__builtin_wasm_memory_size, "z", "nc") +// Note that memory_size is not "c" (readnone) because it must be sequenced with +// respect to grow_memory calls. +BUILTIN(__builtin_wasm_memory_size, "z", "n") BUILTIN(__builtin_wasm_grow_memory, "vz", "n") #undef BUILTIN ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253155 - Use Sema::getLocForEndOfToken instead of Preprocessor::getLocForEndOfToken. NFC
Author: ctopper Date: Sat Nov 14 20:31:46 2015 New Revision: 253155 URL: http://llvm.org/viewvc/llvm-project?rev=253155&view=rev Log: Use Sema::getLocForEndOfToken instead of Preprocessor::getLocForEndOfToken. NFC Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp cfe/trunk/lib/Sema/Sema.cpp cfe/trunk/lib/Sema/SemaDeclAttr.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp cfe/trunk/lib/Sema/SemaDeclObjC.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/lib/Sema/SemaExprCXX.cpp cfe/trunk/lib/Sema/SemaExprObjC.cpp cfe/trunk/lib/Sema/SemaFixItUtils.cpp Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=253155&r1=253154&r2=253155&view=diff == --- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original) +++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Sat Nov 14 20:31:46 2015 @@ -34,7 +34,6 @@ #include "clang/Analysis/CFGStmtMap.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" -#include "clang/Lex/Lexer.h" #include "clang/Lex/Preprocessor.h" #include "clang/Sema/ScopeInfo.h" #include "clang/Sema/SemaInternal.h" @@ -657,8 +656,7 @@ static void CreateIfFixit(Sema &S, const CharSourceRange::getCharRange(If->getLocStart(), Then->getLocStart())); if (Else) { - SourceLocation ElseKwLoc = Lexer::getLocForEndOfToken( - Then->getLocEnd(), 0, S.getSourceManager(), S.getLangOpts()); + SourceLocation ElseKwLoc = S.getLocForEndOfToken(Then->getLocEnd()); Fixit2 = FixItHint::CreateRemoval( SourceRange(ElseKwLoc, Else->getLocEnd())); } Modified: cfe/trunk/lib/Sema/Sema.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=253155&r1=253154&r2=253155&view=diff == --- cfe/trunk/lib/Sema/Sema.cpp (original) +++ cfe/trunk/lib/Sema/Sema.cpp Sat Nov 14 20:31:46 2015 @@ -1469,7 +1469,7 @@ bool Sema::tryToRecoverWithCall(ExprResu // arguments and that it returns something of a reasonable type, // so we can emit a fixit and carry on pretending that E was // actually a CallExpr. -SourceLocation ParenInsertionLoc = PP.getLocForEndOfToken(Range.getEnd()); +SourceLocation ParenInsertionLoc = getLocForEndOfToken(Range.getEnd()); Diag(Loc, PD) << /*zero-arg*/ 1 << Range << (IsCallableWithAppend(E.get()) Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=253155&r1=253154&r2=253155&view=diff == --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Sat Nov 14 20:31:46 2015 @@ -316,7 +316,7 @@ bool Sema::checkStringLiteralArgumentAtt Diag(Loc->Loc, diag::err_attribute_argument_type) << Attr.getName() << AANT_ArgumentString << FixItHint::CreateInsertion(Loc->Loc, "\"") -<< FixItHint::CreateInsertion(PP.getLocForEndOfToken(Loc->Loc), "\""); +<< FixItHint::CreateInsertion(getLocForEndOfToken(Loc->Loc), "\""); Str = Loc->Ident->getName(); if (ArgLocation) *ArgLocation = Loc->Loc; Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=253155&r1=253154&r2=253155&view=diff == --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Sat Nov 14 20:31:46 2015 @@ -7035,7 +7035,7 @@ void Sema::CheckConversionDeclarator(Dec // If we can provide a correct fix-it hint, do so. if (After.isInvalid() && ConvTSI) { SourceLocation InsertLoc = -PP.getLocForEndOfToken(ConvTSI->getTypeLoc().getLocEnd()); +getLocForEndOfToken(ConvTSI->getTypeLoc().getLocEnd()); DB << FixItHint::CreateInsertion(InsertLoc, " ") << FixItHint::CreateInsertionFromRange( InsertLoc, CharSourceRange::getTokenRange(Before)) @@ -8388,7 +8388,7 @@ bool Sema::CheckUsingDeclQualifier(Sourc } else { // Convert 'using X::Y;' to 'typedef X::Y Y;'. SourceLocation InsertLoc = - PP.getLocForEndOfToken(NameInfo.getLocEnd()); + getLocForEndOfToken(NameInfo.getLocEnd()); Diag(InsertLoc, diag::note_using_decl_class_member_workaround) << 1 // typedef declaration << FixItHint::CreateReplacement(UsingLoc, "typedef") @@ -12213,7 +12213,7 @@ FriendDecl *Sema::CheckFriendTypeDecl(So diag::ext_unelaborated_friend_type) << (unsigned) RD->getTagKind() << T - << FixItHint::CreateInsertion(PP.getLocForEndOfToke
r253156 - [Sema] Don't crash trying to diagnose abs called on a pointer type
Author: majnemer Date: Sat Nov 14 21:04:34 2015 New Revision: 253156 URL: http://llvm.org/viewvc/llvm-project?rev=253156&view=rev Log: [Sema] Don't crash trying to diagnose abs called on a pointer type Clang tries to figure out if a call to abs is suspicious by looking through implicit casts to look at the underlying, implicitly converted type. Interestingly, C has implicit conversions from pointer-ish types like function to less exciting types like int. This trips up our 'abs' checker because it doesn't know which variant of 'abs' is appropriate. Instead, diagnose 'abs' called on function types upfront. This sort of thing is highly suspicious and is likely indicative of a missing pointer dereference/function call/array index operation. This fixes PR25532. Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaChecking.cpp cfe/trunk/test/Sema/warn-absolute-value.c Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=253156&r1=253155&r2=253156&view=diff == --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sat Nov 14 21:04:34 2015 @@ -67,6 +67,9 @@ def warn_wrong_absolute_value_type : War "when argument is of %select{integer|floating point|complex}2 type">, InGroup; def note_replace_abs_function : Note<"use function '%0' instead">; +def warn_pointer_abs : Warning< + "taking the absolute value of %select{pointer|function|array}0 type %1 is suspicious">, + InGroup; def warn_infinite_recursive_function : Warning< "all paths through this function will call itself">, Modified: cfe/trunk/lib/Sema/SemaChecking.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=253156&r1=253155&r2=253156&view=diff == --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) +++ cfe/trunk/lib/Sema/SemaChecking.cpp Sat Nov 14 21:04:34 2015 @@ -5085,6 +5085,19 @@ void Sema::CheckAbsoluteValueFunction(co return; } + // Taking the absolute value of a pointer is very suspicious, they probably + // wanted to index into an array, dereference a pointer, call a function, etc. + if (ArgType->isPointerType() || ArgType->canDecayToPointerType()) { +unsigned DiagType = 0; +if (ArgType->isFunctionType()) + DiagType = 1; +else if (ArgType->isArrayType()) + DiagType = 2; + +Diag(Call->getExprLoc(), diag::warn_pointer_abs) << DiagType << ArgType; +return; + } + // std::abs has overloads which prevent most of the absolute value problems // from occurring. if (IsStdAbs) Modified: cfe/trunk/test/Sema/warn-absolute-value.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-absolute-value.c?rev=253156&r1=253155&r2=253156&view=diff == --- cfe/trunk/test/Sema/warn-absolute-value.c (original) +++ cfe/trunk/test/Sema/warn-absolute-value.c Sat Nov 14 21:04:34 2015 @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -verify %s -Wabsolute-value -// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only %s -Wabsolute-value -fdiagnostics-parseable-fixits 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -verify %s -Wabsolute-value -Wno-int-conversion +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only %s -Wabsolute-value -Wno-int-conversion -fdiagnostics-parseable-fixits 2>&1 | FileCheck %s int abs(int); long int labs(long int); @@ -780,3 +780,19 @@ void test_unsigned_long(unsigned long x) // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:9-[[@LINE-3]]:24}:"" } +long long test_array() { + return llabs((long long[]){1}); + // expected-warning@-1 {{absolute value of array type}} +} +long long test_function_pointer() { + return llabs(&test_function_pointer); + // expected-warning@-1 {{absolute value of pointer type}} +} +long long test_void_pointer(void *x) { + return llabs(x); + // expected-warning@-1 {{absolute value of pointer type}} +} +long long test_function() { + return llabs(test_function); + // expected-warning@-1 {{absolute value of function type}} +} ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253157 - [analyzer] Refer to capture field to determine if capture is reference.
Author: dcoughlin Date: Sat Nov 14 21:07:17 2015 New Revision: 253157 URL: http://llvm.org/viewvc/llvm-project?rev=253157&view=rev Log: [analyzer] Refer to capture field to determine if capture is reference. The analyzer incorrectly treats captures as references if either the original captured variable is a reference or the variable is captured by reference. This causes the analyzer to crash when capturing a reference type by copy (PR24914). Fix this by refering solely to the capture field to determine when a DeclRefExpr for a lambda capture should be treated as a reference type. https://llvm.org/bugs/show_bug.cgi?id=24914 rdar://problem/23524412 Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp cfe/trunk/test/Analysis/lambdas.cpp Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=253157&r1=253156&r2=253157&view=diff == --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Sat Nov 14 21:07:17 2015 @@ -1867,7 +1867,7 @@ void ExprEngine::VisitCommonDeclRefExpr( const auto *MD = D ? dyn_cast(D) : nullptr; const auto *DeclRefEx = dyn_cast(Ex); SVal V; -bool CaptureByReference = false; +bool IsReference; if (AMgr.options.shouldInlineLambdas() && DeclRefEx && DeclRefEx->refersToEnclosingVariableOrCapture() && MD && MD->getParent()->isLambda()) { @@ -1882,22 +1882,22 @@ void ExprEngine::VisitCommonDeclRefExpr( // created in the lambda object. assert(VD->getType().isConstQualified()); V = state->getLValue(VD, LocCtxt); +IsReference = false; } else { Loc CXXThis = svalBuilder.getCXXThis(MD, LocCtxt->getCurrentStackFrame()); SVal CXXThisVal = state->getSVal(CXXThis); V = state->getLValue(FD, CXXThisVal); -if (FD->getType()->isReferenceType() && -!VD->getType()->isReferenceType()) - CaptureByReference = true; +IsReference = FD->getType()->isReferenceType(); } } else { V = state->getLValue(VD, LocCtxt); + IsReference = VD->getType()->isReferenceType(); } // For references, the 'lvalue' is the pointer address stored in the // reference region. -if (VD->getType()->isReferenceType() || CaptureByReference) { +if (IsReference) { if (const MemRegion *R = V.getAsRegion()) V = state->getSVal(R); else Modified: cfe/trunk/test/Analysis/lambdas.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/lambdas.cpp?rev=253157&r1=253156&r2=253157&view=diff == --- cfe/trunk/test/Analysis/lambdas.cpp (original) +++ cfe/trunk/test/Analysis/lambdas.cpp Sat Nov 14 21:07:17 2015 @@ -90,6 +90,17 @@ void testReturnValue() { clang_analyzer_eval(b == 8); // expected-warning{{TRUE}} } +void testAliasingBetweenParameterAndCapture() { + int i = 5; + + auto l = [&i](int &p) { +i++; +p++; + }; + l(i); + clang_analyzer_eval(i == 7); // expected-warning{{TRUE}} +} + // Nested lambdas. void testNestedLambdas() { @@ -210,6 +221,67 @@ void captureConstants() { }(); } +void captureReferenceByCopy(int &p) { + int v = 7; + p = 8; + + // p is a reference captured by copy + [&v,p]() mutable { +v = p; +p = 22; + }(); + + clang_analyzer_eval(v == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(p == 8); // expected-warning{{TRUE}} +} + +void captureReferenceByReference(int &p) { + int v = 7; + p = 8; + + // p is a reference captured by reference + [&v,&p]() { +v = p; +p = 22; + }(); + + clang_analyzer_eval(v == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(p == 22); // expected-warning{{TRUE}} +} + +void callMutableLambdaMultipleTimes(int &p) { + int v = 0; + p = 8; + + auto l = [&v, p]() mutable { +v = p; +p++; + }; + + l(); + + clang_analyzer_eval(v == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(p == 8); // expected-warning{{TRUE}} + + l(); + + clang_analyzer_eval(v == 9); // expected-warning{{TRUE}} + clang_analyzer_eval(p == 8); // expected-warning{{TRUE}} +} + +// PR 24914 +struct StructPR24914{ + int x; +}; + +void takesConstStructArgument(const StructPR24914&); +void captureStructReference(const StructPR24914& s) { + [s]() { +takesConstStructArgument(s); + }(); +} + + // CHECK: [B2 (ENTRY)] // CHECK: Succs (1): B1 // CHECK: [B1] ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r253158 - Fix a layering oddity by passing Sema to DeclSpec::Finish instead of DiagnosticsEngine and Preprocessor. Everything the preprocessor was being used for can be acquired from Sema.
Author: ctopper Date: Sat Nov 14 21:32:11 2015 New Revision: 253158 URL: http://llvm.org/viewvc/llvm-project?rev=253158&view=rev Log: Fix a layering oddity by passing Sema to DeclSpec::Finish instead of DiagnosticsEngine and Preprocessor. Everything the preprocessor was being used for can be acquired from Sema. Modified: cfe/trunk/include/clang/Sema/DeclSpec.h cfe/trunk/lib/Parse/ParseDecl.cpp cfe/trunk/lib/Parse/ParseExprCXX.cpp cfe/trunk/lib/Sema/DeclSpec.cpp Modified: cfe/trunk/include/clang/Sema/DeclSpec.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/DeclSpec.h?rev=253158&r1=253157&r2=253158&view=diff == --- cfe/trunk/include/clang/Sema/DeclSpec.h (original) +++ cfe/trunk/include/clang/Sema/DeclSpec.h Sat Nov 14 21:32:11 2015 @@ -41,14 +41,12 @@ namespace clang { class CXXRecordDecl; class TypeLoc; class LangOptions; - class DiagnosticsEngine; class IdentifierInfo; class NamespaceAliasDecl; class NamespaceDecl; class NestedNameSpecifier; class NestedNameSpecifierLoc; class ObjCDeclSpec; - class Preprocessor; class Sema; class Declarator; struct TemplateIdAnnotation; @@ -744,8 +742,7 @@ public: /// Finish - This does final analysis of the declspec, issuing diagnostics for /// things like "_Imaginary" (lacking an FP type). After calling this method, /// DeclSpec is guaranteed self-consistent, even if an error occurred. - void Finish(DiagnosticsEngine &D, Preprocessor &PP, - const PrintingPolicy &Policy); + void Finish(Sema &S, const PrintingPolicy &Policy); const WrittenBuiltinSpecs& getWrittenBuiltinSpecs() const { return writtenBS; Modified: cfe/trunk/lib/Parse/ParseDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=253158&r1=253157&r2=253158&view=diff == --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) +++ cfe/trunk/lib/Parse/ParseDecl.cpp Sat Nov 14 21:32:11 2015 @@ -2671,7 +2671,7 @@ void Parser::ParseDeclarationSpecifiers( // If this is not a declaration specifier token, we're done reading decl // specifiers. First verify that DeclSpec's are consistent. - DS.Finish(Diags, PP, Policy); + DS.Finish(Actions, Policy); return; case tok::l_square: @@ -4821,7 +4821,7 @@ void Parser::ParseTypeQualifierListOpt(D DoneWithTypeQuals: // If this is not a type-qualifier token, we're done reading type // qualifiers. First verify that DeclSpec's are consistent. - DS.Finish(Diags, PP, Actions.getASTContext().getPrintingPolicy()); + DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy()); if (EndLoc.isValid()) DS.SetRangeEnd(EndLoc); return; Modified: cfe/trunk/lib/Parse/ParseExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExprCXX.cpp?rev=253158&r1=253157&r2=253158&view=diff == --- cfe/trunk/lib/Parse/ParseExprCXX.cpp (original) +++ cfe/trunk/lib/Parse/ParseExprCXX.cpp Sat Nov 14 21:32:11 2015 @@ -1821,7 +1821,7 @@ void Parser::ParseCXXSimpleTypeSpecifier DS.SetRangeEnd(Tok.getAnnotationEndLoc()); ConsumeToken(); -DS.Finish(Diags, PP, Policy); +DS.Finish(Actions, Policy); return; } @@ -1877,12 +1877,12 @@ void Parser::ParseCXXSimpleTypeSpecifier case tok::annot_decltype: case tok::kw_decltype: DS.SetRangeEnd(ParseDecltypeSpecifier(DS)); -return DS.Finish(Diags, PP, Policy); +return DS.Finish(Actions, Policy); // GNU typeof support. case tok::kw_typeof: ParseTypeofSpecifier(DS); -DS.Finish(Diags, PP, Policy); +DS.Finish(Actions, Policy); return; } if (Tok.is(tok::annot_typename)) @@ -1890,7 +1890,7 @@ void Parser::ParseCXXSimpleTypeSpecifier else DS.SetRangeEnd(Tok.getLocation()); ConsumeToken(); - DS.Finish(Diags, PP, Policy); + DS.Finish(Actions, Policy); } /// ParseCXXTypeSpecifierSeq - Parse a C++ type-specifier-seq (C++ @@ -1906,7 +1906,7 @@ void Parser::ParseCXXSimpleTypeSpecifier /// bool Parser::ParseCXXTypeSpecifierSeq(DeclSpec &DS) { ParseSpecifierQualifierList(DS, AS_none, DSC_type_specifier); - DS.Finish(Diags, PP, Actions.getASTContext().getPrintingPolicy()); + DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy()); return false; } Modified: cfe/trunk/lib/Sema/DeclSpec.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/DeclSpec.cpp?rev=253158&r1=253157&r2=253158&view=diff == --- cfe/trunk/lib/Sema/DeclSpec.cpp (original) +++ cfe/trunk/lib/Sema/DeclSpec.cpp Sat Nov 14 21:32:11 2015 @@ -19,7 +19,6 @@ #include "clang/AST/TypeLoc.h" #include "clang/Basic/LangOptions.h" #include "