Correct 'target' default behavior on redecl, allow forward declaration.
authorErich Keane <erich.keane@intel.com>
Wed, 28 Nov 2018 20:58:43 +0000 (20:58 +0000)
committerErich Keane <erich.keane@intel.com>
Wed, 28 Nov 2018 20:58:43 +0000 (20:58 +0000)
commit7304f0a66eef2951441af1f77aab3baf453825fe
tree5db4bb5653e5a4f6bad9c9fff4a1730255f7ea10
parent83db1d219ec154758c3b1209f2696b6c088fa2b0
Correct 'target' default behavior on redecl, allow forward declaration.

Declarations without the attribute were disallowed because it would be
ambiguous which 'target' it was supposed to be on.  For example:

void ___attribute__((target("v1"))) foo();
void foo(); // Redecl of above, or fwd decl of below?
void ___attribute__((target("v2"))) foo();

However, a first declaration doesn't have that problem, and erroring
prevents it from working in cases where the forward declaration is
useful.

Additionally, a forward declaration of target==default wouldn't properly
cause multiversioning, so this patch fixes that.

The patch was not split since the 'default' fix would require
implementing the same check for that case, followed by undoing the same
change for the fwd-decl implementation.

Change-Id: I66f2c5bc2477bcd3f7544b9c16c83ece257077b0
llvm-svn: 347805
clang/lib/AST/ASTContext.cpp
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/Sema/SemaDecl.cpp
clang/test/CodeGen/attr-target-mv.c
clang/test/Sema/attr-target-mv.c