@@ -1899,13 +1899,16 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
18991899 const Address Loc =
19001900 locIsByrefHeader ? emission.getObjectAddress (*this ) : emission.Addr ;
19011901
1902+ auto hasNoTrivialAutoVarInitAttr = [&](const Decl *D) {
1903+ return D && D->hasAttr <NoTrivialAutoVarInitAttr>();
1904+ };
19021905 // Note: constexpr already initializes everything correctly.
19031906 LangOptions::TrivialAutoVarInitKind trivialAutoVarInit =
1904- (D.isConstexpr ()
1907+ ((D.isConstexpr () || D.getAttr <UninitializedAttr>() ||
1908+ hasNoTrivialAutoVarInitAttr (type->getAsTagDecl ()) ||
1909+ hasNoTrivialAutoVarInitAttr (CurFuncDecl))
19051910 ? LangOptions::TrivialAutoVarInitKind::Uninitialized
1906- : (D.getAttr <UninitializedAttr>()
1907- ? LangOptions::TrivialAutoVarInitKind::Uninitialized
1908- : getContext ().getLangOpts ().getTrivialAutoVarInit ()));
1911+ : getContext ().getLangOpts ().getTrivialAutoVarInit ());
19091912
19101913 auto initializeWhatIsTechnicallyUninitialized = [&](Address Loc) {
19111914 if (trivialAutoVarInit ==
@@ -1944,13 +1947,13 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
19441947 replaceUndef (CGM, isPattern, constant));
19451948 }
19461949
1947- if (constant && D. getType () ->isBitIntType () &&
1948- CGM.getTypes ().typeRequiresSplitIntoByteArray (D. getType () )) {
1950+ if (constant && type ->isBitIntType () &&
1951+ CGM.getTypes ().typeRequiresSplitIntoByteArray (type )) {
19491952 // Constants for long _BitInt types are split into individual bytes.
19501953 // Try to fold these back into an integer constant so it can be stored
19511954 // properly.
1952- llvm::Type *LoadType = CGM. getTypes (). convertTypeForLoadStore (
1953- D. getType () , constant->getType ());
1955+ llvm::Type *LoadType =
1956+ CGM. getTypes (). convertTypeForLoadStore (type , constant->getType ());
19541957 constant = llvm::ConstantFoldLoadFromConst (
19551958 constant, LoadType, llvm::APInt::getZero (32 ), CGM.getDataLayout ());
19561959 }
@@ -1967,8 +1970,7 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
19671970 // It may be that the Init expression uses other uninitialized memory,
19681971 // but auto-var-init here would not help, as auto-init would get
19691972 // overwritten by Init.
1970- if (!D.getType ()->isScalarType () || capturedByInit ||
1971- isAccessedBy (D, Init)) {
1973+ if (!type->isScalarType () || capturedByInit || isAccessedBy (D, Init)) {
19721974 initializeWhatIsTechnicallyUninitialized (Loc);
19731975 }
19741976 }
0 commit comments