forked from OSchip/llvm-project
337d5aa58f
r235046 turned "extern __declspec(selectany) int a;" from a declaration into a definition to fix PR23242 (required for compatibility with mc.exe output). However, this broke parsing Windows headers: A d3d11 headers contain something like struct SomeStruct {}; extern const __declspec(selectany) SomeStruct some_struct; This is now a definition, and const objects either need an explicit default ctor or an initializer so this errors out with d3d11.h(1065,48) : error: default initialization of an object of const type 'const CD3D11_DEFAULT' without a user-provided default constructor (cl.exe just doesn't implement this rule, independent of selectany.) To work around this, weaken this error into a warning for selectany decls in microsoft mode, and recover with zero-initialization. Doing this is a bit hairy since it adds a fixit on an error emitted by InitializationSequence – this means it needs to build a correct AST, which in turn means InitializationSequence::Failed() cannot return true when this fixit is applied. As a workaround, the patch adds a fixit member to InitializationSequence, and InitializationSequence::Perform() prints the diagnostic if the fixit member is set right after its call to Diagnose. That function is usually called when InitializationSequences are used – InitListChecker::PerformEmptyInit() doesn't call it, but the InitListChecker case never performs default-initialization, so this is technically OK. This is the alternative, original fix for PR20208 that got reviewed in the thread "[patch] Improve diagnostic on default-initializing const variables (PR20208)". This change basically reverts r213725, adds the original fix for PR20208, and makes the error a warning in Microsoft mode. llvm-svn: 235166 |
||
---|---|---|
.. | ||
AnalysisBasedWarnings.cpp | ||
AttributeList.cpp | ||
CMakeLists.txt | ||
CodeCompleteConsumer.cpp | ||
DeclSpec.cpp | ||
DelayedDiagnostic.cpp | ||
IdentifierResolver.cpp | ||
JumpDiagnostics.cpp | ||
Makefile | ||
MultiplexExternalSemaSource.cpp | ||
Scope.cpp | ||
ScopeInfo.cpp | ||
Sema.cpp | ||
SemaAccess.cpp | ||
SemaAttr.cpp | ||
SemaCUDA.cpp | ||
SemaCXXScopeSpec.cpp | ||
SemaCast.cpp | ||
SemaChecking.cpp | ||
SemaCodeComplete.cpp | ||
SemaConsumer.cpp | ||
SemaDecl.cpp | ||
SemaDeclAttr.cpp | ||
SemaDeclCXX.cpp | ||
SemaDeclObjC.cpp | ||
SemaExceptionSpec.cpp | ||
SemaExpr.cpp | ||
SemaExprCXX.cpp | ||
SemaExprMember.cpp | ||
SemaExprObjC.cpp | ||
SemaFixItUtils.cpp | ||
SemaInit.cpp | ||
SemaLambda.cpp | ||
SemaLookup.cpp | ||
SemaObjCProperty.cpp | ||
SemaOpenMP.cpp | ||
SemaOverload.cpp | ||
SemaPseudoObject.cpp | ||
SemaStmt.cpp | ||
SemaStmtAsm.cpp | ||
SemaStmtAttr.cpp | ||
SemaTemplate.cpp | ||
SemaTemplateDeduction.cpp | ||
SemaTemplateInstantiate.cpp | ||
SemaTemplateInstantiateDecl.cpp | ||
SemaTemplateVariadic.cpp | ||
SemaType.cpp | ||
TreeTransform.h | ||
TypeLocBuilder.cpp | ||
TypeLocBuilder.h |