OK, sounds good. Let's merge it.
On Thu, Aug 14, 2014 at 12:12 PM, David Majnemer <[email protected]> wrote: > On Thu, Aug 14, 2014 at 11:47 AM, Reid Kleckner <[email protected]> wrote: > >> Two things: >> >> 1. I would check Triple::isOSBinFormatCOFF() instead of the MSVC-ness of >> the environment. I think both Cygwin and MinGW probably use the .CRT$XCU >> section for initializers. >> > > Nope, neither do: > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectFileInfo.cpp?revision=214538&view=markup#l629 > > >> >> 2. Should we parse the pragma for well-formedness before ignoring it in >> Sema::ActOnPragmaInitSeg? >> > > Eh, we could but it's not likely to do anything helpful. > > >> >> >> On Thu, Aug 14, 2014 at 12:58 AM, David Majnemer < >> [email protected]> wrote: >> >>> Should this get merged in for the next release? >>> >>> >>> On Wed, Aug 13, 2014 at 11:35 PM, David Majnemer < >>> [email protected]> wrote: >>> >>>> Author: majnemer >>>> Date: Thu Aug 14 01:35:08 2014 >>>> New Revision: 215618 >>>> >>>> URL: http://llvm.org/viewvc/llvm-project?rev=215618&view=rev >>>> Log: >>>> Parse: Don't attempt to act on #pragma init_seg when not targeting MSVC >>>> >>>> It doesn't really make sense to try and do stuff with #pragma init_seg >>>> when targeting non-Microsoft platforms; notions like library vs user >>>> initializers don't exist for other targets. >>>> >>>> This fixes PR20639. >>>> >>>> Modified: >>>> cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td >>>> cfe/trunk/lib/Parse/ParsePragma.cpp >>>> cfe/trunk/test/SemaCXX/pragma-init_seg.cpp >>>> >>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td >>>> URL: >>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=215618&r1=215617&r2=215618&view=diff >>>> >>>> ============================================================================== >>>> --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) >>>> +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Thu Aug 14 >>>> 01:35:08 2014 >>>> @@ -867,6 +867,11 @@ def warn_pragma_pack_malformed : Warning >>>> def warn_pragma_unused_expected_var : Warning< >>>> "expected '#pragma unused' argument to be a variable name">, >>>> InGroup<IgnoredPragmas>; >>>> +// - #pragma init_seg >>>> +def warn_pragma_init_seg_unsupported_target : Warning< >>>> + "'#pragma init_seg' is only supported when targeting a " >>>> + "Microsoft environment">, >>>> + InGroup<IgnoredPragmas>; >>>> // - #pragma fp_contract >>>> def err_pragma_fp_contract_scope : Error< >>>> "'#pragma fp_contract' can only appear at file scope or at the start >>>> of a " >>>> >>>> Modified: cfe/trunk/lib/Parse/ParsePragma.cpp >>>> URL: >>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParsePragma.cpp?rev=215618&r1=215617&r2=215618&view=diff >>>> >>>> ============================================================================== >>>> --- cfe/trunk/lib/Parse/ParsePragma.cpp (original) >>>> +++ cfe/trunk/lib/Parse/ParsePragma.cpp Thu Aug 14 01:35:08 2014 >>>> @@ -12,6 +12,7 @@ >>>> >>>> >>>> //===----------------------------------------------------------------------===// >>>> >>>> #include "RAIIObjectsForParser.h" >>>> +#include "clang/Basic/TargetInfo.h" >>>> #include "clang/Lex/Preprocessor.h" >>>> #include "clang/Parse/ParseDiagnostic.h" >>>> #include "clang/Parse/Parser.h" >>>> @@ -661,6 +662,11 @@ bool Parser::HandlePragmaMSSegment(Strin >>>> // #pragma init_seg({ compiler | lib | user | "section-name" [, >>>> func-name]} ) >>>> bool Parser::HandlePragmaMSInitSeg(StringRef PragmaName, >>>> SourceLocation PragmaLocation) { >>>> + if (getTargetInfo().getTriple().getEnvironment() != >>>> llvm::Triple::MSVC) { >>>> + PP.Diag(PragmaLocation, >>>> diag::warn_pragma_init_seg_unsupported_target); >>>> + return false; >>>> + } >>>> + >>>> if (ExpectAndConsume(tok::l_paren, diag::warn_pragma_expected_lparen, >>>> PragmaName)) >>>> return false; >>>> >>>> Modified: cfe/trunk/test/SemaCXX/pragma-init_seg.cpp >>>> URL: >>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/pragma-init_seg.cpp?rev=215618&r1=215617&r2=215618&view=diff >>>> >>>> ============================================================================== >>>> --- cfe/trunk/test/SemaCXX/pragma-init_seg.cpp (original) >>>> +++ cfe/trunk/test/SemaCXX/pragma-init_seg.cpp Thu Aug 14 01:35:08 2014 >>>> @@ -1,5 +1,7 @@ >>>> // RUN: %clang_cc1 -fsyntax-only -verify -fms-extensions %s -triple >>>> x86_64-pc-win32 >>>> +// RUN: %clang_cc1 -fsyntax-only -verify -fms-extensions %s -triple >>>> i386-apple-darwin13.3.0 >>>> >>>> +#ifndef __APPLE__ >>>> #pragma init_seg(L".my_seg") // expected-warning {{expected >>>> 'compiler', 'lib', 'user', or a string literal}} >>>> #pragma init_seg( // expected-warning {{expected 'compiler', 'lib', >>>> 'user', or a string literal}} >>>> #pragma init_seg asdf // expected-warning {{missing '('}} >>>> @@ -10,6 +12,10 @@ >>>> #pragma init_seg("\x") // expected-error {{\x used with no following >>>> hex digits}} >>>> #pragma init_seg("a" L"b") // expected-warning {{expected non-wide >>>> string literal in '#pragma init_seg'}} >>>> >>>> -int f(); >>>> #pragma init_seg(compiler) >>>> +#else >>>> +#pragma init_seg(compiler) // expected-warning {{'#pragma init_seg' is >>>> only supported when targeting a Microsoft environment}} >>>> +#endif >>>> + >>>> +int f(); >>>> int __declspec(thread) x = f(); // expected-error {{initializer for >>>> thread-local variable must be a constant expression}} >>>> >>>> >>>> _______________________________________________ >>>> cfe-commits mailing list >>>> [email protected] >>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>>> >>> >>> >> >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
