Commit Graph

2514 Commits

Author SHA1 Message Date
Hans Wennborg 987bbbe471 Downgrade error about adding 'dllimport' to used free function to warning (PR24215)
The code will still work as it can reference the function via its thunk.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242973 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-22 23:54:51 +00:00
Hubert Tong 174a281e55 [CONCEPTS] Add diagnostics: non-defining function; non-namespace scope
Summary:
Create diagnostic for function concept declaration which is not a
definition.

Create diagnostic for concept declaration which isn't in namespace
scope.

Create associated tests.

Reviewers: rsmith, faisalv, fraggamuffin, hubert.reinterpretcast

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D11027

Patch by Nathan Wilson!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242899 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-22 13:32:36 +00:00
Richard Smith a4f29fcf3b [modules] In C++, stop serializing and deserializing a list of declarations in
the identifier table. This is redundant, since the TU-scope lookups are also
serialized as part of the TU DeclContext, and wasteful in a number of ways. We
still emit the decls for PCH / preamble builds, since for those we want
identical results, not merely semantically equivalent ones.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242855 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-21 23:54:07 +00:00
Richard Smith 1b8c2ec280 [modules] Don't save uninteresting identifiers, and don't consider identifiers
to be interesting just because they are the name of a builtin. Reduces the size
of an empty module by over 80% (~100KB).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242650 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-19 21:41:12 +00:00
Aaron Ballman 236d794324 Disable #pragma redefine_extname for C++ code as it does not make sense in such a context.
Patch by Andrey Bokhanko!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242420 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-16 17:06:53 +00:00
Paul Robinson d574782178 Add a "maximum TLS alignment" characteristic to the target info, so it
can be different from the normal variable maximum.
Add an error diagnostic for when TLS variables exceed maximum TLS alignment.
Currenty only PS4 sets an explicit maximum TLS alignment.

Patch by Charles Li!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242198 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-14 20:52:32 +00:00
David Majnemer 810e25ed9e [Sema] Emit a better diagnostic when variable redeclarations disagree
We referred to all declaration in definitions in our diagnostic messages
which is can be inaccurate.  Instead, classify the declaration and emit
an appropriate diagnostic for the new declaration and an appropriate
note pointing to the old one.

This fixes PR24116.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242190 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-14 20:08:49 +00:00
Justin Bogner 2290c8daa2 Sema: Allow null names to be passed in to isAcceptableTagRedeclaration
It's possible for TagRedeclarations to involve decls without a name,
ie, anonymous enums. We hit some undefined behaviour if we bind these
null names to the reference here.

We never dereference the name, so it's harmless if it's null - make it
a pointer to allow that.

Fixes the Modules/submodules-merge-defs.cpp test under ubsan.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241963 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-10 23:05:47 +00:00
Richard Smith 7ee76c4bfc Refactor to avoid long if-condition.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241518 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-06 22:56:29 +00:00
Richard Smith 6c360f9e49 PR24030, PR24033: Consistently check whether a new declaration conflicts with
an existing using shadow declaration if they define entities of the same kind
in different namespaces.

We'd previously check this consistently if the using-declaration came after the
other declaration, but not if it came before.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241428 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-06 04:43:58 +00:00
Richard Smith 1a3c131196 DR1909: Diagnose all invalid cases of a class member sharing its name with the class.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241425 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-06 01:45:27 +00:00
Richard Smith fd434d0f15 When we see something that looks like a constructor with a return type, only issue one error, not two.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241424 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-06 01:04:39 +00:00
Richard Smith 6b4b8ef2b2 [modules] Don't require the 'inline' specifier when merging an inline function;
any source of the inline nature is sufficient.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241146 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-01 07:24:18 +00:00
Richard Smith e4090833ea Rework parsing of pure-specifiers. Perform the grammar matching and
disambiguation in the parser rather than trying to do it in Sema.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241032 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-30 01:28:56 +00:00
Richard Smith 7ee27b7c76 PR23942: a pure-specifier's integer literal must be spelled '0'
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241019 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-29 23:19:23 +00:00
Davide Italiano 0e5f3dd5b4 [Sema] Unions cannot have virtual functions.
PR:		PR23931
Differential Revision:	http://reviews.llvm.org/D10752
Reviewed by:  rsmith


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240889 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-27 19:18:55 +00:00
Aaron Ballman 8765c84df3 Fix #pragma redefine_extname when there is a local variable of the same name. The local should not be renamed, only the externally-available declaration should be.
Patch by Andrey Bokhanko!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240653 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-25 15:37:16 +00:00
Douglas Gregor 673b679df9 Replace __double_underscored type nullability qualifiers with _Uppercase_underscored
Addresses a conflict with glibc's __nonnull macro by renaming the type
nullability qualifiers as follows:

  __nonnull -> _Nonnull
  __nullable -> _Nullable
  __null_unspecified -> _Null_unspecified

This is the major part of rdar://problem/21530726, but does not yet
provide the Darwin-specific behavior for the old names.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240596 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-24 22:02:08 +00:00
Alexander Kornienko 8ca7705aa3 Revert r240270 ("Fixed/added namespace ending comments using clang-tidy").
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240353 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-22 23:07:51 +00:00
Richard Smith 5fa53a9a30 [modules] Add a flag to disable the feature that permits conflicting redefinitions of internal-linkage symbols that are not visible.
Such conflicts are an accident waiting to happen, and this feature conflicts
with the desire to include existing headers into multiple modules and merge the
results. (In an ideal world, it should not be possible to export internal
linkage symbols from a module, but sadly the glibc and libstdc++ headers
provide 'static inline' functions in a few cases.)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240335 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-22 21:15:01 +00:00
Douglas Gregor 51ef4b95aa Misc. cleanups suggested by Aaron Ballman
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240297 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-22 17:19:03 +00:00
Alexander Kornienko ac58acc7f2 Fixed/added namespace ending comments using clang-tidy. NFC
The patch is generated using this command:

  $ tools/extra/clang-tidy/tool/run-clang-tidy.py -fix \
      -checks=-*,llvm-namespace-comment -header-filter='llvm/.*|clang/.*' \
      work/llvm/tools/clang

To reduce churn, not touching namespaces spanning less than 10 lines.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240270 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-22 09:47:44 +00:00
Saleem Abdulrasool 68f30d3e03 Sema: add a helper for enumerating the TST id (NFC)
The same pattern was repeated a few times.  Create a trivial helper method to
map the Type Specifier to an ID for the diagnostic.  Flip the selection order on
one of the diagnostic messages to get the same ordering across all of the
messages.  This makes the emission of the diagnostic slightly more legible by
changing the cascading ternary into a switch in a function.  NFC.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240251 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-21 23:05:52 +00:00
Saleem Abdulrasool 679f7b58e4 Sema: convert decl + while loop into for loop (NFC)
Convert a hand rolled for loop into an explicit for loop.  NFC.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240245 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-21 18:20:01 +00:00
Douglas Gregor e3a960065d Extend type nullability qualifiers for Objective-C.
Introduce context-sensitive, non-underscored nullability specifiers
(nonnull, nullable, null_unspecified) for Objective-C method return
types, method parameter types, and properties.

Introduce Objective-C-specific semantics, including computation of the
nullability of the result of a message send, merging of nullability
information from the @interface of a class into its @implementation,
etc .

This is the Objective-C part of rdar://problem/18868820.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240154 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-19 18:14:38 +00:00
Douglas Gregor a46fb43c1f Introduce type nullability specifiers for C/C++.
Introduces the type specifiers __nonnull, __nullable, and
__null_unspecified that describe the nullability of the pointer type
to which the specifier appertains. Nullability type specifiers improve
on the existing nonnull attributes in a few ways:
  - They apply to types, so one can represent a pointer to a non-null
    pointer, use them in function pointer types, etc.
  - As type specifiers, they are syntactically more lightweight than
    __attribute__s or [[attribute]]s.
  - They can express both the notion of 'should never be null' and
  also 'it makes sense for this to be null', and therefore can more
  easily catch errors of omission where one forgot to annotate the
  nullability of a particular pointer (this will come in a subsequent
  patch).

Nullability type specifiers are maintained as type sugar, and
therefore have no effect on mangling, encoding, overloading,
etc. Nonetheless, they will be used for warnings about, e.g., passing
'null' to a method that does not accept it.

This is the C/C++ part of rdar://problem/18868820.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240146 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-19 17:51:05 +00:00
Daniel Marjamaki c40533901b [clang] Refactoring of conditions so they use isOneOf() instead of multiple is().
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240008 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-18 10:59:26 +00:00
Richard Smith ebc80e4942 [modules] Ensure that if we merge the definitions of two enumerations, that
making either of them visible makes the merged definition visible.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239969 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-17 23:07:50 +00:00
Richard Smith f7ada5829f [modules] Fix assert/crash when parsing and merging a definition of a class with a base-specifier inside a namespace.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239569 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-11 22:48:25 +00:00
Richard Smith 4c83c92a53 [modules] Fix a few places where merging wasn't performed if modules was disabled but local module visibilty was enabled.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239504 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-11 03:05:39 +00:00
Serge Pavlov d7421384ec Do not parse members of incomplete class.
If definition of a class is unknown and out-of-line definition of its
member is encountered, do not parse the member declaration.
This change fixes PR18542.

Differential Revision: http://reviews.llvm.org/D8010


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239483 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-10 19:06:59 +00:00
Alexander Musman c024327365 PR5172: Fix for a bug in pragma redefine_extname implementation:
it doesn't work correctly when a structure is declared before pragma
and then a function with the same name declared after pragma.

Patch by Andrey Bokhanko

Differential Revision: http://reviews.llvm.org/D10187



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239466 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-10 11:20:26 +00:00
Richard Smith 36ce648ee5 [modules] Support for merging a parsed definition of a static data member of a class template into an imported but hidden definition.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237647 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-19 00:49:29 +00:00
Richard Smith f804390611 [modules] Move implicit creation of ImportDecls for #includes transformed into module imports from the frontend into Sema where it belongs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237555 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-18 05:35:52 +00:00
Richard Smith 049e702bb3 [modules] Add local submodule visibility support for declarations.
With this change, enabling -fmodules-local-submodule-visibility results in name
visibility rules being applied to submodules of the current module in addition
to imported modules (that is, names no longer "leak" between submodules of the
same top-level module). This also makes it much safer to textually include a
non-modular library into a module: each submodule that textually includes that
library will get its own "copy" of that library, and so the library becomes
visible no matter which including submodule you import.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237473 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-15 20:05:43 +00:00
Peter Collingbourne 4afd81447f Make GNUInline consistent with whether we use traditional GNU inline semantics.
Previously we were setting LangOptions::GNUInline (which controls whether we
use traditional GNU inline semantics) if the language did not have the C99
feature flag set. The trouble with this is that C++ family languages also
do not have that flag set, so we ended up setting this flag in C++ modes
(and working around it in a few places downstream by also checking CPlusPlus).

The fix is to check whether the C89 flag is set for the target language,
rather than whether the C99 flag is cleared. This also lets us remove most
CPlusPlus checks. We continue to test CPlusPlus when deciding whether to
pre-define the __GNUC_GNU_INLINE__ macro for consistency with GCC.

There is a change in semantics in two other places
where we weren't checking both CPlusPlus and GNUInline
(FunctionDecl::doesDeclarationForceExternallyVisibleDefinition and
FunctionDecl::isInlineDefinitionExternallyVisible), but this change seems to
put us back into line with GCC's semantics (test case: test/CodeGen/inline.c).

While at it, forbid -fgnu89-inline in C++ modes, as GCC doesn't support it,
it didn't have any effect before, and supporting it just makes things more
complicated.

Differential Revision: http://reviews.llvm.org/D9333

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237299 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-13 22:07:22 +00:00
David Majnemer 35ec179e2b Give isCompatibleWithMSVC a better interface
We now use an enum which maps the marketing name (almost always a year)
to the major version number.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236967 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-11 03:57:49 +00:00
Richard Smith 93517ddb4a [modules] Suport for merging a parsed enum definition into an existing imported but not visible definition.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236690 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-07 03:54:19 +00:00
Kaelyn Takata b9af15e888 Allow TransformTypos to ignore corrections to a specified VarDecl.
This is needed to prevent a TypoExpr from being corrected to a variable
when the TypoExpr is a subexpression of that variable's initializer.

Also exclude more keywords from the correction candidate pool when the
subsequent token is .* or ->* since keywords like "new" or "return"
aren't valid on the left side of those operators.

Fixes PR23140.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236519 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-05 19:17:03 +00:00
Richard Smith e48ab7f6b5 [modules] Start moving the module visibility information off the Module itself.
It has no place there; it's not a property of the Module, and it makes
restoring the visibility set when we leave a submodule more difficult.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236300 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-01 01:53:09 +00:00
Artem Belevich 1a5e6db211 [cuda] Preserve TLS storage class of host variable even if it's a
device-side compilation.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236029 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-28 20:31:49 +00:00
Richard Smith 41bd0122fa PR23334: Perform semantic checking of lambda capture initialization in the right context.
Previously we'd try to perform checks on the captures from the middle of
parsing the lambda's body, at the point where we detected that a variable
needed to be captured. This was wrong in a number of subtle ways. In
PR23334, we couldn't correctly handle the list of potential odr-uses
resulting from the capture, and our attempt to recover from that resulted
in a use-after-free.

We now defer building the initialization expression until we leave the lambda
body and return to the enclosing context, where the initialization does the
right thing. This patch only covers lambda-expressions, but we should apply
the same change to blocks and captured statements too.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235921 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-27 21:27:54 +00:00
Artem Belevich 427de0837b [cuda] Ignore "TLS unsupported by target" errors for host variables during device compilation.
During device-side CUDA compilation clang currently complains about
all TLS variables, regardless of whether they are __host__ or
__device__.

This patch suppresses "TLS unsupported" errors for host variables
during device compilation and for device variables during host
compilation.

Differential Revision: http://reviews.llvm.org/D9269

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235907 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-27 19:37:53 +00:00
David Majnemer 3ca1dc1fb5 [Sema] Don't allow unverified bitfields in FieldDecls
VerifyBitField must be called if we are to form a bitfield FieldDecl.
We will not verify the bitfield if the decl is known to be malformed in
other ways; pretend that we don't have a bitfield if this happens.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235816 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-26 04:58:18 +00:00
Davide Italiano ca305f5bb0 [Sema] Check if a builtin is FunctionPrototype().
Don't assume it's always is. This prevents a crash in Sema while
trying to merge return type for a builtin w/out function prototype.
 
PR:		23086
Differential Revision:	http://reviews.llvm.org/D9235
Reviewed by:	rsmith


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235806 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-25 20:20:04 +00:00
Aaron Ballman f92f076224 Diagnose variadic main() as an extension; addresses PR17905.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235605 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-23 16:12:42 +00:00
Nico Weber f1fca8d335 Wrap to 80 columns, fix typo in comment. No behavior change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235470 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-22 03:44:51 +00:00
David Majnemer 118ce1ffe3 [Sema] Don't crash if array bound calculation overflowed constexpr array
We didn't correctly expect a QualifiedTypeLoc when faced with fixing a
variable array type into a constant array type.

Differential Revision: http://reviews.llvm.org/D8958

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235251 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-18 04:55:51 +00:00
Kaelyn Takata ca50ab9c99 Properly implement warn_unused_result checking for classes/structs.
The previous implementation would copy the attribute from the class to
functions that have the class as their return type when the functions
are first declared. This proved to have two flaws:
  1) if the class is forward-declared without the attribute and a
     function or method with the class as a its return type is declared,
     and afterward the class is defined with warn_unused_result, the
     function or method would never inherit the attribute, and
  2) the check simply failed for functions and methods that are part of
     a template instantiation, regardless of whether the class with
     warn_unused_result is part of a specific instantiation or part of
     the template itself (presumably because those function/method
     declaration does not hit the same code path as a non-template one
     and so never inherits the attribute).

The new approach is to instead modify the two places where a function or
method call is checked for the warn_unused_result attribute on the decl
by extending the checks to also look for the attribute on the decl's
return type.

Additionally, the check for return types that have the warn_unused_result
now excludes pointers and references to such types, as such return types do
not necessarily imply a transfer of ownership for the underlying object
being referred to by the return value. This does not change the behavior
of functions that are directly given the warn_unused_result attribute.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234526 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-09 19:43:04 +00:00
Richard Smith 74e3a016fd [modules] Allow a function template definition if we have a pre-existing but not visible definition of the same template.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233430 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-27 21:57:41 +00:00
Richard Smith d4edf61101 [modules] Allow a function to be redefined if the old definition is not visible.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233407 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-27 20:16:58 +00:00
Richard Smith 0b27aaf8c2 [modules] Handle defining a tag with a typedef name for linkage purposes on top of an existing imported-but-not-visible definition.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233345 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-27 01:37:43 +00:00
Richard Smith 4babb8dca1 [modules] Handle defining a class template on top of an existing imported-but-not-visible definition.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233341 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-27 00:41:57 +00:00
Richard Smith 441319ae34 [modules] If we reach a definition of a class for which we already have a
non-visible definition, skip the new definition and make the old one visible
instead of trying to parse it again and failing horribly. C++'s ODR allows
us to assume that the two definitions are identical.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233250 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-26 04:09:53 +00:00
David Majnemer b2102bd391 MS ABI: Implement the MSVC 2015 scheme for scope disambiguation
consider C++ that looks like:
  inline int &f(bool b) {
    if (b) {
      static int i;
      return i;
    }
    static int i;
    return i;
  }

Both 'i' variables must have distinct (and stable) names for linkage
purposes.  The MSVC 2013 ABI would number the variables using a count of
the number of scopes that have been created.  However, the final 'i'
returns to a scope that has already been created leading to a mangling
collision.

MSVC 2015 fixes this by giving the second 'i' the name it would have if
it were declared before the 'if'.  However, this results in ABI breakage
because the mangled name, in cases where there was no ambiguity, would
now be different.

We implement the new behavior and only enable it if we are targeting the
MSVC 2015 ABI, otherwise the old behavior will be used.

This fixes PR18131.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232766 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-19 21:54:30 +00:00
Yaron Keren 9bd91b686a Remove many superfluous SmallString::str() calls.
Now that SmallString is a first-class citizen, most SmallString::str()
calls are not required. This patch removes a whole bunch of them, yet
there are lots more.

There are two use cases where str() is really needed:
1) To use one of StringRef member functions which is not available in
SmallString.
2) To convert to std::string, as StringRef implicitly converts while 
SmallString do not. We may wish to change this, but it may introduce
ambiguity.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232622 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-18 10:17:07 +00:00
Kaelyn Takata de2a93dd31 Fix a crash when the size of an 'auto' is needed and its initalizer
contained a typo correction (the auto decl was being marked as dependent
unnecessarily, which triggered an assertion in cases where the size of
the type is needed).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232568 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-17 23:50:12 +00:00
Reid Kleckner c52bc77bc2 MS ABI: Delay default constructor closure checking until the outermost class scope ends
Previously, we would error out on this code because the default argument
wasn't parsed until the end of Outer:

  struct __declspec(dllexport) Outer {
    struct __declspec(dllexport) Inner {
      Inner(void *p = 0);
    };
  };

Now we do the checking on the closing brace of Outer instead of Inner.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232519 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-17 19:00:50 +00:00
Dmitri Gribenko 1725aee338 Comment parsing: move a diagnostic to the correct group.
Based on a patch by LE GARREC Vincent.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232511 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-17 18:03:42 +00:00
David Majnemer 810def84ac MS ABI: Generate default constructor closures
The MS ABI utilizes a compiler generated function called the "vector
constructor iterator" to construct arrays of objects with
non-trivial constructors/destructors.  For this to work, the constructor
must follow a specific calling convention.  A thunk must be created if
the default constructor has default arguments, is variadic or is
otherwise incompatible.  This thunk is called the default constructor
closure.

N.B.  Default constructor closures are only generated if the default
constructor is exported because clang itself does not utilize vector
constructor iterators.  Failing to export the default constructor
closure will result in link/load failure if a translation unit compiled
with MSVC is on the import side.

Differential Revision: http://reviews.llvm.org/D8331

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232229 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-13 22:36:55 +00:00
Benjamin Kramer bcf994970a Sema: Don't emit a missing prototype warning for deleted functions.
This is a bit more involved than I anticipated, so here's a breakdown
of the changes:
  1. Call ActOnFinishFunctionBody _after_ we parsed =default and
     =delete specifiers. Saying that we finished the body before parsing
     =default is just wrong. Changing this allows us to use isDefaulted
     and isDeleted on a decl in ActOnFinishFunctionBody.
  2. Check for -Wmissing-prototypes after we parsed the function body.
  3. Disable -Wmissing-prototypes when the Decl isDeleted.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232040 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-12 14:28:47 +00:00
David Majnemer 99823a7524 Sema: Properly track mangling number/name for linkage for using decls
Using declarations which are aliases to struct types have their name
used as the struct type's name for linkage purposes.  Otherwise, make
sure to give an anonymous struct defined inside a using declaration a
mangling number to disambiguate it from other anonymous structs in the
same context.

This fixes PR22809.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231909 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-11 06:45:39 +00:00
Nico Weber 0760c33250 Wrap to 80 columns. No behavior change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231621 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-09 02:33:32 +00:00
Nico Weber 0ea456c219 Wrap to 80 columns. No behavior change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231573 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-07 19:52:39 +00:00
Richard Smith 499fc534bd Replace Sema's map of locally-scoped extern "C" declarations with a DeclContext
of extern "C" declarations. This is simpler and vastly more efficient for
modules builds (we no longer need to load *all* extern "C" declarations to
determine if we have a redeclaration).

No functionality change intended.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231538 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-07 00:04:49 +00:00
Reid Kleckner 54ccb94652 Implement section pragma feedback on r205810
Mostly short-circuits some conditionals.  Adds target validation of
sections passed to these pragmas.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231317 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-04 23:39:17 +00:00
Manuel Klimek 9b354d5398 Make -Wuninitialized warn on pointer-to-member and comma operators.
`isTrackedVar` has been updated to also track records.
`DeclRefExpr`s appearing on the left side of a comma operator are
ignored, while those appearing on the right side are classified as
`Use`.

Patch by Enrico Pertoso.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231068 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-03 14:54:25 +00:00
Richard Smith a2e36d21c0 Rework our handling of key functions. We used to track a complete list of all
dynamic classes in the translation unit and check whether each one's key
function is defined when we got to the end of the TU (and when we got to the
end of each module). This is really terrible for modules performance, since it
causes unnecessary deserialization of every dynamic class in every compilation.

We now use a much simpler (and, in a modules build, vastly more efficient)
system: when we see an out-of-line definition of a virtual function, we check
whether that function was in fact its class's key function. (If so, we need to
emit the vtable.)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230830 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-28 01:01:56 +00:00
Alexey Bataev df4a627fcd [MSVC] Improved lookup into dependent/non-dependent bases of dependent class
Patch improves lookup into dependendt bases of dependent class and adds lookup
into non-dependent bases.
Differential Revision: http://reviews.llvm.org/D7173


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229817 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-19 04:28:23 +00:00
Meador Inge 6e4c907c67 Sema: Allow 'constexpr' variables in range loops
This fixes PR22492, which is in response to CWG issue #1204.
Per the CWG issue 'contexpr' variables are now allowed in
for range loops.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229716 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-18 18:34:59 +00:00
Nico Weber b279682bcd Port r163224 to C++.
The motivation is to fix a crash on

  struct S {} s;
  Foo S::~S() { s.~S(); }

What was happening here was that S::~S() was marked as invalid since its
return type is invalid, and as a consequence CheckFunctionDeclaration() wasn't
called and S::~S() didn't get merged into S's implicit destructor.  This way,
the class ended up with two destructors, which confused the overload printer
when it suddenly had to print two possible destructors for `s.~S()`.

In addition to fixing the crash, this change also seems to improve diagnostics
in a few other places, see test changes.

Crash found by SLi's bot.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229639 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-18 05:19:40 +00:00
Nico Weber 6f21bc5316 Wrap to 80 columns. No behavior change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229637 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-18 04:53:03 +00:00
Meador Inge 56448b4d4b Revert r229543.
Reverting this while build bot failures are investigated.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229550 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-17 21:42:45 +00:00
Meador Inge 0891ded8c3 Sema: Allow 'constexpr' variables in range loops
This fixes PR22492, which is in response to CWG issue #1204.
Per the CWG issue 'contexpr' variables are now allowed in
for range loops.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229543 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-17 21:02:56 +00:00
Benjamin Kramer 57772dcbac Prefer SmallVector::append/insert over push_back loops. Clang edition.
Same functionality, but hoists the vector growth out of the loop.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229508 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-17 16:48:30 +00:00
Nico Weber 7506fe5f8f Wrap to 80 columns. No behavior change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229282 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-15 06:15:40 +00:00
Nico Weber ccb8223ee8 Make a reference const. No behavior change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229242 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-14 05:47:01 +00:00
Richard Smith 39bece84e9 Add a warning for direct-list-initialization of a variable with a deduced type
(or of a lambda init-capture, which is sort-of such a variable). The semantics
of such constructs will change when we implement N3922, so we intend to warn on
this in Clang 3.6 then change the semantics in Clang 3.7.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@228792 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-11 02:41:33 +00:00
David Majnemer 33947ed22c Sema: Don't give attribute alias vars with struct type an init expr
We'd give the VarDecl a CXXConstructExpr even though it is annotated
with an alias attribute.  This would make us trip over sanity checking
asserts.

This fixes PR22493.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@228523 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-08 10:55:14 +00:00
Alexey Bataev c55f729746 [MSVC2012] Allow 'mutable' references
Some standard header files from MSVC2012 use 'mutable' on references, though it is directly prohibited by the standard.
Fix for http://llvm.org/PR22444
Differential Revision: http://reviews.llvm.org/D7370


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@228113 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-04 04:45:32 +00:00
Nico Weber 6ef07019e1 Weaken an assertion that isn't true for invalid input.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@227540 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-30 01:48:49 +00:00
David Majnemer 9ec272cccd Revert "Sema: err_after_alias is unreachable, remove it"
This reverts commit r226626.  err_after_alias is, in fact, reachable.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226633 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-21 01:30:40 +00:00
David Majnemer 1bddbab7ee Sema: err_after_alias is unreachable, remove it
Examples this would have catched are now handled by the attribute
verification code.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226626 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-21 00:52:17 +00:00
Kaelyn Takata 2fd6030616 Correct all typos in the initialization arguments, even if one could not
be corrected.

This fixes PR22250, which exposed the bug where if there's more than one
TypoExpr in the arguments, once one failed to be corrected none of the
TypoExprs after it would be handled at all thanks to an early return.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226624 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-21 00:04:19 +00:00
Ben Langmuir 1b3cb15b99 Fix crashes on missing @interface for category
In a few places we didn't check that Category->getClassInterface() was
not null before using it.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226605 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-20 20:41:36 +00:00
David Majnemer f2625b1503 Add back a check removed in r226436
It shouldn't have been removed, the code which replaced it didn't cover
this case.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226442 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-19 10:21:22 +00:00
David Majnemer 7e7e7a90a1 Sema: Variable definitions cannot be __attribute__((alias))
Things that are OK:
  extern int var1 __attribute((alias("v1")));
  static int var2 __attribute((alias("v2")));

Things that are not OK:
  int var3 __attribute((alias("v3")));
  extern int var4 __attribute((alias("v4"))) = 4;

We choose to accpet:
  struct S { static int var5 __attribute((alias("v5"))); };

  This code causes assertion failues in GCC 4.8 and ICC 13.0.1, we have
  no reason to reject it.

This partially fixes PR22217.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226436 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-19 09:00:28 +00:00
Nico Weber c04fe08bbe If a function decl cannot be merged, mark it as invalid.
Clang currently crashes on

    class C {
      C() = default;
      C() = delete;
    };

My cunning plan for fixing this was to change the `if (!FnD)` in
Parser::ParseCXXInlineMethodDef() to `if (!FnD || FnD->isInvalidDecl)` – but
alas, the second constructor decl wasn't marked as invalid.  This lets
Sema::MergeFunctionDecl() return true on function redeclarations, which leads
to them being marked invalid.

This also improves error messages when functions are redeclared.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226365 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-17 02:33:17 +00:00
David Majnemer 0d42e35ecc Sema: Recover when a function template is in an extern "C" block
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226135 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-15 07:04:38 +00:00
David Majnemer 53bfa51bec Sema: It's cheaper to ask LookupResult::empty than to calculate linkage
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225960 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-14 08:08:52 +00:00
David Majnemer e8c28154d9 Sema: Check type compatibility with the most recent decl when merging
We would check the type information from the declaration found by lookup
but we would neglect checking compatibility with the most recent
declaration.  This would make it possible for us to not correctly
diagnose inconsistencies with declarations which were made in a
different scope.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225934 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-14 02:27:38 +00:00
David Majnemer 3806cf84dc Sema: An extern declaration can't be a redeclaration of a parameter
In the following:
void f(int x) { extern int x; }

The second declaration of 'x' shouldn't be considered a redeclaration of
the parameter.

This is a different approach to r225780.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225875 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-14 00:31:13 +00:00
Paul Robinson 02e4be86fb When attribute 'optnone' appears on the same declaration with a
conflicting attribute, warn about the conflict and pick a "winning"
attribute to preserve, instead of emitting an error.  This matches the
behavior when the conflicting attributes are on different declarations.

Along the way I discovered that conflicts involving __forceinline were
reported as 'always_inline' (alternate spelling, same attribute) so
fixed that up to report the attribute as spelled in the source.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225813 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-13 18:34:56 +00:00
David Majnemer 29b6ec9d09 Revert "Sema: An extern declaration can't be a redeclaration of a parameter"
This reverts commit r225780, we can't compile line 181 in
sanitizer_platform_limits_posix.cc with this commit.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225781 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-13 10:14:57 +00:00
David Majnemer 940569b471 Sema: An extern declaration can't be a redeclaration of a parameter
In the following:
void f(int x) { extern int x; }

The second declaration of 'x' shouldn't be considered a redeclaration of
the parameter.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225780 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-13 09:55:56 +00:00
Nico Weber e728fbb485 Mark vtable used on explicit destructor definitions.
There are two things in a C++ program that need to read the vtable pointer:
Constructors and destructors.  (A few other operations -- virtual calls,
dynamic cast, rtti -- read the vtable pointer off a this pointer, but for
this they don't need the vtable symbol.)  Implicit constructors and destructors
and explicit constructors already marked the vtable as used, but explicit
destructors didn't.

Note that the only thing sema's "mark a class's vtable used" does is to mark all 
final overriders of the class as referenced, it does _not_ cause emission of
the vtable itself.  This is done on demand by codegen, independent of sema,
since sema might emit functions that are not referenced.  (The exception are
vtables that are forced via key functions -- these are forced onto codegen
by sema.)

This bug went unnoticed for years because it doesn't have observable effects
(yet -- I want to change this in PR20337, which is why I noticed this).

r213109 made it so that _calls_ to constructors don't mark the vtable used.
Currently, _calls_ to destructors still mark the vtable used.  If that
wasn't the case, this program would tickle the problem:

  test.h:
    template <typename T>
    struct B {
      int* p;
      virtual ~B() { delete p; }
      virtual void f() {}
    };

    struct __attribute__((visibility("default"))) C {
      C();
      B<int> m;
    };

  test2.cc:
    #include "test.h"
    int main() {
      C* c = new C;
      delete c;
    }

  test3.cc:
    #include "test.h"
    C::C() {}

  # This bin/clang++ binary doesn't MarkVTableUsed() for virtual dtor calls:
  $ bin/clang++ -shared test3.cc -std=c++11 -O2  -fvisibility=hidden \
        -fvisibility-inlines-hidden  -o libtest3.dylib
  $ bin/clang++ test2.cc -std=c++11 -O2  -fvisibility=hidden \
        -fvisibility-inlines-hidden  libtest3.dylib 
  Undefined symbols for architecture x86_64:
    "B<int>::f()", referenced from:
        vtable for B<int> in test2-af8f4f.o
  ld: symbol(s) not found for architecture x86_64

What's happening here is that there's a copy of B's vtable hidden in
libtest3.dylib, because C's constructor caused an implicit instantiation of that
(and implicit constructors generate vtables).
test2.cc calls C's destructDr, which destroys the B<int> member,
which wants to overwrite the vtable back to B (think of B as the base of a class
hierarchy, and of hierarchical destruction -- maybe we shouldn't do the vtable
writing in destructors of final classes), but there's nothing in test2.cc that
marks B's vtable used.  So codegen writes out the vtable, but since it wasn't
marked used, sema didn't mark all the virtual functions (in particular f())
as used.

Note that this change makes us reject programs we didn't reject before (see
the included Sema test case), but both gcc and cl also reject this code, and
clang used to reject it before r213109.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225761 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-13 03:52:11 +00:00
Alexey Bataev f52aaa57ce Rename RefersToCapturedVariable to RefersToEnclosingVariableOrCapture, NFC
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225624 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-12 10:17:46 +00:00
David Majnemer 747fe82ae7 Sema: Don't crash when variable is redefined as a constexpr function
We have a diagnostic describing that constexpr changed in C++14 when
compiling in C++11 mode.  While doing this, it examines the previous
declaration and assumes that it is a function.  However it is possible,
in the context of error recovery, for this to not be the case.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225518 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-09 10:33:23 +00:00
David Majnemer a2f75da3f0 Sema: RecordDecl shouldn't have a FunctionDecl as a Decl
RecordDecls should have things like CXXMethodDecls or FriendDecls as a
decl but not things like FunctionDecls.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225511 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-09 07:36:13 +00:00
David Majnemer ea6cc726d1 Sema: Don't crash when specializing a global scope function in a class
We assumed that class-scope specializations would result in a
CXXMethodDecl for that class.  However, globally qualified functions
will result in normal FunctionDecls.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225508 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-09 06:10:21 +00:00
David Majnemer d3711a0f2d Sema: Remove some dead code from CreateNewFunctionDecl
The same code is already in Sema::ActOnFunctionDeclarator, the only
caller of CreateNewFunctionDecl.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225506 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-09 05:56:10 +00:00
Kaelyn Takata d255266a06 Handle OpaqueValueExprs more intelligently in the TransformTypos tree
transform.

Also diagnose typos in the initializer of an invalid C++ declaration.
Both issues were hit using the same line of test code, depending on
whether the code was treated as C or C++.

Fixes PR22092.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225389 91177308-0d34-0410-b5e6-96231b3b80d8
2015-01-07 21:16:39 +00:00
David Majnemer a7e277784b Sema: Don't crash when solitary :: token appears before { in struct def
hasDeclaratorForAnonDecl, getDeclaratorForAnonDecl and
getTypedefNameForAnonDecl are expected to handle the case where
NamedDeclOrQualifier holds the wrong type or nothing at all.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224912 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-29 05:17:46 +00:00
David Majnemer 0ee66aad3e Sema: Don't crash when an inject class name has a nested redefinition
We expected the type of a TagDecl to be a TagType, not an
InjectedClassNameType.  Introduced a helper method, Type::getAsTagDecl,
to abstract away the difference; redefine Type::getAsCXXRecordDecl to be
in terms of it.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224898 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-28 09:18:54 +00:00
Kaelyn Takata 5f7701a4de Try typo correction on all initialization arguments and be less
pessimistic about when to do so.

This also fixes PR21905 as the initialization argument was no longer
viewed as being type dependent due to the TypoExpr being type-cast.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224386 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-16 23:07:00 +00:00
Alexey Bataev dc1e969d8e Renamed RefersToEnclosingLocal bitfield to RefersToCapturedVariable.
Bitfield RefersToEnclosingLocal of Stmt::DeclRefExprBitfields renamed to RefersToCapturedVariable to reflect latest changes introduced in commit 224323. Also renamed method Expr::refersToEnclosingLocal() to Expr::refersToCapturedVariable() and comments for constant arguments.
No functional changes.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224329 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-16 08:01:48 +00:00
Paul Robinson eefcef89c7 Warn when attribute 'optnone' conflicts with attributes on a
different declaration of the same function.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224256 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-15 18:57:28 +00:00
Sean Hunt 6724817052 Create a new 'flag_enum' attribute.
This attribute serves as a hint to improve warnings about the ranges of
enumerators used as flag types. It currently has no working C++ implementation
due to different semantics for enums in C++. For more explanation, see the docs
and testcases.

Reviewed by Aaron Ballman.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222906 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-28 00:53:20 +00:00
Richard Trieu abd574ee5f When checking for uninitialized values, do not confuse "std::move" with every
other function named "move".


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222863 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-27 01:29:32 +00:00
Kaelyn Takata b108f094f0 Properly correct initializer expressions based on whether they would be valid.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222550 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-21 18:48:00 +00:00
Bob Wilson 7a620261c6 Fix missing diagnostic for unsupported TLS for some thread_local variables.
Clang r181627 moved a check for block-scope variables into this code for
handling thread storage class specifiers, but in the process, it broke the
logic for checking if the target supports TLS. Fix this with some simple
restructuring of the code. rdar://problem/18796883

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222512 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-21 06:52:52 +00:00
John McCall e89e1418ad Fix an assertion when ending a function definition.
The bug is that ExprCleanupObjects isn't always empty
in a fresh evaluation context.  New evaluation contexts just
track the current depth of the stack.

The assertion will misfire whenever we finish processing
a function body inside an expression that contained an earlier
block literal with non-trivial captures.  That's actually
a lot less likely than you'd think, though, because it has
to be a real function declaration, not just another block.
Mixed block/lambda code would work, as would a template
instantiation or a local class definition.

The code works correctly if the assertion is disabled.

rdar://16356628

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222194 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-18 00:19:01 +00:00
David Blaikie 3de29e1e7d Remove some redundant virtual specifiers on overriden functions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222024 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-14 19:09:44 +00:00
Richard Smith 773d19cce4 PR21437, final part of DR1330: delay-parsing of exception-specifications. This
is a re-commit of Doug's r154844 (modernized and updated to fit into current
Clang).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221918 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-13 20:01:57 +00:00
Reid Kleckner 8a8ccbf4fb Move the no-prototype calling conv check after decl merging
Now we don't warn on this code:
  void __stdcall f(void);
  void __stdcall f();

My previous commit regressed this functionality because I didn't update
the relevant test case which used a definition.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221188 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-03 21:56:03 +00:00
Reid Kleckner 734e0ab01d Don't diagnose no-prototype callee-cleanup function definitions
We already have a warning on the call sites of code like this:
  void f() { }
  void g() { f(1, 2, 3); }
t.c:2:21: warning: too many arguments in call to 'f'

We can limit ourselves to diagnosing unprototyped forward declarations
of f to cut down on noise.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221184 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-03 21:24:50 +00:00
Hans Wennborg 956edcd5d5 Don't dllimport inline functions when targeting MinGW (PR21366)
It turns out that MinGW never dllimports of exports inline functions.
This means that code compiled with Clang would fail to link with
MinGW-compiled libraries since we might try to import functions that
are not imported.

To fix this, make Clang never dllimport inline functions when targeting
MinGW.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221154 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-03 14:24:45 +00:00
Richard Trieu 0ca36e7c00 Have -Wuninitialized catch uninitalized use in overloaded operator arguments.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221000 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-31 21:10:22 +00:00
Craig Topper 5a3c1a32ba Remove StorageClass typedefs from VarDecl and FunctionDecl since StorageClass is in the clang namespace.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220956 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-31 06:57:13 +00:00
Hans Wennborg 3e9c1922fa Follow-up to r216619: use isCXXCLassMember() instead of trying to
check the context ourselves when selectively allowing late-added
dll attributes on unused free functions and variables (PR20746)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220874 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-29 21:20:57 +00:00
Kaelyn Takata 07ccb0381a Pass around CorrectionCandidateCallbacks as unique_ptrs so
TypoCorrectionConsumer can keep the callback around as long as needed.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220693 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-27 18:07:29 +00:00
Reid Kleckner cb348a9ab7 Add frontend support for __vectorcall
Wire it through everywhere we have support for fastcall, essentially.

This allows us to parse the MSVC "14" CTP headers, but we will
miscompile them because LLVM doesn't support __vectorcall yet.

Reviewed By: Aaron Ballman

Differential Revision: http://reviews.llvm.org/D5808

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220573 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-24 17:42:17 +00:00
Hal Finkel a2be46b72e Add RestrictQualifierLoc to DeclaratorChunk::FunctionTypeInfo
Clang supports __restrict__ as a function qualifier, but
DeclaratorChunk::FunctionTypeInfo lacked a field to track the qualifier's
source location (as we do with volatile, etc.). This was the subject of a FIXME
in GetFullTypeForDeclarator (in SemaType.cpp). This should also prove useful as
we add more warnings regarding questionable uses of the restrict qualifier.

There is no significant functional change (except for an improved source range
associated with the err_invalid_qualified_function_type diagnostic fixit
generated by GetFullTypeForDeclarator).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220215 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-20 17:32:04 +00:00
Saleem Abdulrasool dc6d797fc1 Sema: handle additional case of qualified types
A second instance of attributed types escaped the previous change, identified
thanks to Richard Smith!  When deducing the void case, we would also assume that
the type would not be attributed.  Furthermore, properly handle multiple
attributes being applied to a single TypeLoc.

Properly handle this case and future-proof a bit by ignoring parenthesis
further.  The test cases do use the additional parenthesis to ensure that this
case remains properly handled.

Addresses post-commit review comments from Richard Smith to SVN r219851.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219974 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-16 22:42:53 +00:00
Hans Wennborg 1bd711969c MS Compat: mark globals emitted in read-only sections const
They cannot be written to, so marking them const makes sense and may improve
optimisation.

As a side-effect, SectionInfos has to be moved from Sema to ASTContext.

It also fixes this problem, that occurs when compiling ATL:

  warning LNK4254: section 'ATL' (C0000040) merged into '.rdata' (40000040) with different attributes

The ATL headers are putting variables in a special section that's marked
read-only. However, Clang currently can't model that read-onlyness in the IR.
But, by making the variables const, the section does become read-only, and
the linker warning is avoided.

Differential Revision: http://reviews.llvm.org/D5812

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219960 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-16 20:52:46 +00:00
Aaron Ballman 822389da58 Adding attributes to the IndirectFieldDecl that we generate for anonymous struct/union fields. This fixes PR20930.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219807 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-15 16:58:18 +00:00
Nikola Smiljanic 107c30e239 -ms-extensions: Allow __super in return stements.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219050 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-04 10:17:57 +00:00
David Majnemer 18fa1456dc MS ABI: Disallow dllimported/exported variables from having TLS
Windows TLS relies on indexing through a tls_index in order to get at
the DLL's thread local variables.  However, this index is not exported
along with the variable: it is assumed that all accesses to thread local
variables are inside the same module which created the variable in the
first place.

While there are several implementation techniques we could adopt to fix
this (notably, the Itanium ABI gets this for free), it is not worth the
heroics.

Instead, let's just ban this combination.  We could revisit this in the
future if we need to.

This fixes PR21111.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219049 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-04 06:51:54 +00:00
David Majnemer 751c0f0d3c Sema: Simplify checkAttributesAfterMerging
Use getDLLAttr to factor out some common dllimport/dllexport code.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219048 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-04 06:16:45 +00:00
Richard Trieu deabe6ff5d Update -Wuninitialized to be stricter on CK_NoOp casts.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218715 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-30 23:04:37 +00:00
Richard Trieu 5ce2184600 Add back checking for condition of conditional operator for -Wuninitialized
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218556 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-26 23:48:30 +00:00
Nikola Smiljanic 7159053ff3 -ms-extensions: Implement __super scope specifier (PR13236).
We build a NestedNameSpecifier that records the CXXRecordDecl in which
__super appeared. Name lookup is performed in all base classes of the
recorded CXXRecordDecl. Use of __super is allowed only inside class and
member function scope.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218484 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-26 00:28:20 +00:00
Richard Trieu 702863c43d Add increment/decrement operators and compound assignment operators to the
uninitialized checkers that did not have them before.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218435 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-25 01:15:40 +00:00
David Majnemer dc251c9c6c Sema: Inherit the flexible array property from struct fields
A record which contains a flexible array member is itself a flexible
array member.  A struct which contains such a record should also
consider itself to be a flexible array member.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218378 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-24 11:04:09 +00:00
Richard Trieu c056275a82 Fix an edge case with BinaryOperator's in -Wuninitialized. Add testcases for
the other visitors as well.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218366 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-24 03:53:56 +00:00
Richard Trieu 86dc7fea0b Improve -Wuninitialized to take into account field ordering with initializer
lists.  Since the fields are inititalized one at a time, using a field with
lower index to initialize a higher indexed field should not be warned on.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218339 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-23 22:52:42 +00:00
Ehsan Akhgari d88b0e1b7f ms-inline-asm: Scope inline asm labels to functions
Summary:
This fixes PR20023.  In order to implement this scoping rule, we piggy
back on the existing LabelDecl machinery, by creating LabelDecl's that
will carry the "internal" name of the inline assembly label, which we
will rewrite the asm label to.

Reviewers: rnk

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D4589

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218230 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-22 02:21:54 +00:00
Nico Weber 5305cff6f2 Follow-up to r214408: Warn on other callee-cleanup functions without prototype too.
According to lore, we used to verifier-fail on:

  void __thiscall f();
  int main() { f(1); }

So that's fixed now. System headers use prototype-less __stdcall functions,
so make that a warning that's DefaultError -- then it fires on regular code
but is suppressed in system headers.

Since it's used in system headers, we have codegen tests for this; massage
them slightly so that they still compile.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218166 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-19 23:07:12 +00:00
David Majnemer 89b53e0a49 Sema: Diagnose undefined structs used as Microsoft anonymous structs
Previously, we would not mark structs containing anonymous structs as
invalid.  Later, horrific things would occur when trying to determine
the size of the parent record.

Instead, require the struct to be a complete type when used as an
anonymous struct.  Mark both the anonymous field for the struct and the
parent context as invalid (this is similar to what we do when a struct
contains a field with an incomplete type.)

This fixes PR11847.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218006 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-18 00:42:05 +00:00
Ehsan Akhgari 885f51439b Allow empty statements in naked functions in addition to ASM statements
Summary: This fixes PR20883.

Test Plan: The patch includes an automated test.

Reviewers: hansw

Differential Revision: http://reviews.llvm.org/D5256

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217413 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-09 02:49:40 +00:00
Nico Weber 4f2a6d6d73 Add -Wunused-local-typedef, a warning that finds unused local typedefs.
The warning warns on TypedefNameDecls -- typedefs and C++11 using aliases --
that are !isReferenced(). Since the isReferenced() bit on TypedefNameDecls
wasn't used for anything before this warning it wasn't always set correctly,
so this patch also adds a few missing MarkAnyDeclReferenced() calls in
various places for TypedefNameDecls.

This is made a bit complicated due to local typedefs possibly being used only
after their local scope has closed. Consider:

    template <class T>
    void template_fun(T t) {
      typename T::Foo s3foo;  // YYY
      (void)s3foo;
    }
    void template_fun_user() {
      struct Local {
        typedef int Foo;  // XXX
      } p;
      template_fun(p);
    }

Here the typedef in XXX is only used at end-of-translation unit, when YYY in
template_fun() gets instantiated. To handle this, typedefs that are unused when
their scope exits are added to a set of potentially unused typedefs, and that
set gets checked at end-of-TU. Typedefs that are still unused at that point then
get warned on. There's also serialization code for this set, so that the
warning works with precompiled headers and modules. For modules, the warning
is emitted when the module is built, for precompiled headers each time the
header gets used.

Finally, consider a function using C++14 auto return types to return a local
type defined in a header:

    auto f() {
      struct S { typedef int a; };
      return S();
    }

Here, the typedef escapes its local scope and could be used by only some
translation units including the header. To not warn on this, add a
RecursiveASTVisitor that marks all delcs on local types returned from auto
functions as referenced. (Except if it's a function with internal linkage, or
the decls are private and the local type has no friends -- in these cases, it
_is_ safe to warn.)

Several of the included testcases (most of the interesting ones) were provided
by Richard Smith.

(gcc's spelling -Wunused-local-typedefs is supported as an alias for this
warning.)


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217298 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-06 01:25:55 +00:00
Richard Trieu 2b6150769d Stop double visiting some expressions during self reference checking.
Originally, self reference checking made a double pass over some expressions
to handle reference type checking.  Now, allow HandleValue to also check
reference types, and fallback to Visit for unhandled expressions.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217203 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-04 23:19:34 +00:00
Hans Wennborg 5417edc777 Don't allow non-ASM statements in naked functions
Naked functions don't have prologues or epilogues, so doing
codegen for anything other than inline assembly would be completely
hit or miss.

Differential Revision: http://reviews.llvm.org/D5183

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217199 91177308-0d34-0410-b5e6-96231b3b80d8
2014-09-04 22:16:40 +00:00
Alexey Samsonov cdfa631f06 Don't load invalid enum value in Sema::LazilyCreateBuiltin.
This bug was reported by UBSan.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216696 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-28 23:34:32 +00:00
Alexey Bataev 51be7a6a02 [C++11] Support for capturing of variable length arrays in lambda expression.
Differential Revision: http://reviews.llvm.org/D4368


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216649 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-28 04:28:19 +00:00
Richard Trieu 9b25aa4ae0 More -Wuninitialized updates
Fix r216438 to catch more complicated self-initialized in std::move.  For
instance, "Foo f = std::move(cond ? OtherFoo : (UNUSED_VALUE, f));"

Make sure that BinaryConditionalOperator, ConditionalOperator, BinaryOperator
with comma operator, and OpaqueValueExpr perform the correct usage forwarding
across the three uninitialized value checkers.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216627 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-27 22:15:10 +00:00
Hans Wennborg eaf4ee9a6f Allow adding dll attributes on certain redecls with a warning if the decl hasn't been used yet (PR20746)
This shouldn't really be allowed, but it comes up in real code (see PR). As
long as the decl hasn't been used there's no technical difficulty in supporting
it, so downgrade the error to a warning.

Differential Revision: http://reviews.llvm.org/D5087

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216619 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-27 21:27:40 +00:00
Richard Smith a3d8172512 Clarify comment so this doesn't appear to be a C11-only rule.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216490 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-26 21:51:57 +00:00
Fariborz Jahanian 63823dea71 revert patch r216469.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216485 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-26 21:10:47 +00:00
Fariborz Jahanian 1bd3f74654 c11- Check for c11 language option as documentation says
feature is c11 about nested struct declarations must have
struct-declarator-list. Without this change, code
which was meant for c99 breaks. rdar://18125536


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216469 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-26 18:13:47 +00:00