<html>
<head>
<base href="https://llvm.org/bugs/" />
</head>
<body><table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Bug ID</th>
<td><a class="bz_bug_link
bz_status_NEW "
title="NEW --- - Clang crashes on dllexport class with a default argument constructor"
href="https://llvm.org/bugs/show_bug.cgi?id=28137">28137</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>Clang crashes on dllexport class with a default argument constructor
</td>
</tr>
<tr>
<th>Product</th>
<td>clang
</td>
</tr>
<tr>
<th>Version</th>
<td>trunk
</td>
</tr>
<tr>
<th>Hardware</th>
<td>PC
</td>
</tr>
<tr>
<th>OS</th>
<td>Windows NT
</td>
</tr>
<tr>
<th>Status</th>
<td>NEW
</td>
</tr>
<tr>
<th>Severity</th>
<td>normal
</td>
</tr>
<tr>
<th>Priority</th>
<td>P
</td>
</tr>
<tr>
<th>Component</th>
<td>-New Bugs
</td>
</tr>
<tr>
<th>Assignee</th>
<td>unassignedclangbugs@nondot.org
</td>
</tr>
<tr>
<th>Reporter</th>
<td>mattiwatti@gmail.com
</td>
</tr>
<tr>
<th>CC</th>
<td>llvm-bugs@lists.llvm.org
</td>
</tr>
<tr>
<th>Classification</th>
<td>Unclassified
</td>
</tr></table>
<p>
<div>
<pre>Code to reproduce:
template<typename T>
constexpr T Ident(T t)
{
return t;
}
class __declspec(dllexport) B
{
B(int = 0) {}
void f()
{
Ident(0);
}
};
Command line used: clang -cc1 -triple x86_64-pc-windows-msvc19
-fms-compatibility -std=c++14 -emit-llvm foo.cpp -o foo.ll. I am using clang
3.9 (trunk 272663) on Windows, and clang 3.8 on Linux.
Compiling the above asserts with DefaultArg && "sema forgot to instantiate
default args".
Stacktrace:
[...snip CRT spew...]
clang.exe!`anonymous namespace'::MicrosoftCXXABI::getAddrOfCXXCtorClosure(const
clang::CXXConstructorDecl * CD, clang::CXXCtorType CT) Line 3864
clang.exe!`anonymous namespace'::MicrosoftCXXABI::EmitCXXConstructors(const
clang::CXXConstructorDecl * D) Line 1199
clang.exe!clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl * D) Line
3795
clang.exe!`anonymous namespace'::CodeGeneratorImpl::EmitDeferredDecls() Line
162
clang.exe!`anonymous
namespace'::CodeGeneratorImpl::HandlingTopLevelDeclRAII::~HandlingTopLevelDeclRAII()
Line 57
clang.exe!`anonymous
namespace'::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef DG) Line
150
clang.exe!clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef D)
Line 120
clang.exe!clang::Sema::InstantiateFunctionDefinition(clang::SourceLocation
PointOfInstantiation, clang::FunctionDecl * Function, bool Recursive, bool
DefinitionRequired, bool AtEndOfTU) Line 3722
clang.exe!clang::Sema::MarkFunctionReferenced(clang::SourceLocation Loc,
clang::FunctionDecl * Func, bool MightBeOdrUse) Line 13076
clang.exe!clang::Sema::MarkAnyDeclReferenced(clang::SourceLocation Loc,
clang::Decl * D, bool MightBeOdrUse) Line 14041
clang.exe!MarkExprReferenced(clang::Sema & SemaRef, clang::SourceLocation Loc,
clang::Decl * D, clang::Expr * E, bool MightBeOdrUse) Line 13975
clang.exe!clang::Sema::MarkDeclRefReferenced(clang::DeclRefExpr * E) Line 14006
clang.exe!clang::Sema::FixOverloadedFunctionReference(clang::Expr * E,
clang::DeclAccessPair Found, clang::FunctionDecl * Fn) Line 13039
clang.exe!FinishOverloadedCallExpr(clang::Sema & SemaRef, clang::Scope * S,
clang::Expr * Fn, clang::UnresolvedLookupExpr * ULE, clang::SourceLocation
LParenLoc, llvm::MutableArrayRef<clang::Expr *> Args, clang::SourceLocation
RParenLoc, clang::Expr * ExecConfig, clang::OverloadCandidateSet *
CandidateSet, clang::OverloadCandidate * * Best, clang::OverloadingResult
OverloadResult, bool AllowTypoCorrection) Line 11346
clang.exe!clang::Sema::BuildOverloadedCallExpr(clang::Scope * S, clang::Expr *
Fn, clang::UnresolvedLookupExpr * ULE, clang::SourceLocation LParenLoc,
llvm::MutableArrayRef<clang::Expr *> Args, clang::SourceLocation RParenLoc,
clang::Expr * ExecConfig, bool AllowTypoCorrection, bool CalleesAddressIsTaken)
Line 11451
clang.exe!clang::Sema::ActOnCallExpr(clang::Scope * S, clang::Expr * Fn,
clang::SourceLocation LParenLoc, llvm::MutableArrayRef<clang::Expr *> ArgExprs,
clang::SourceLocation RParenLoc, clang::Expr * ExecConfig, bool IsExecConfig)
Line 5194
clang.exe!clang::Parser::ParsePostfixExpressionSuffix(clang::ActionResult<clang::Expr
*,1> LHS) Line 1602
clang.exe!clang::Parser::ParseCastExpression(bool isUnaryExpression, bool
isAddressOfOperand, bool & NotCastExpr, clang::Parser::TypeCastState
isTypeCast) Line 1369
clang.exe!clang::Parser::ParseCastExpression(bool isUnaryExpression, bool
isAddressOfOperand, clang::Parser::TypeCastState isTypeCast) Line 482
clang.exe!clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState
isTypeCast) Line 172
clang.exe!clang::Parser::ParseExpression(clang::Parser::TypeCastState
isTypeCast) Line 122
clang.exe!clang::Parser::ParseExprStatement() Line 403
clang.exe!clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt
*,32> & Stmts, clang::Parser::AllowedContsructsKind Allowed,
clang::SourceLocation * TrailingElseLoc,
clang::Parser::ParsedAttributesWithRange & Attrs) Line 225
clang.exe!clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt
*,32> & Stmts, clang::Parser::AllowedContsructsKind Allowed,
clang::SourceLocation * TrailingElseLoc) Line 116
clang.exe!clang::Parser::ParseCompoundStatementBody(bool isStmtExpr) Line 987
clang.exe!clang::Parser::ParseFunctionStatementBody(clang::Decl * Decl,
clang::Parser::ParseScope & BodyScope) Line 1940
clang.exe!clang::Parser::ParseLexedMethodDef(clang::Parser::LexedMethod & LM)
Line 558
clang.exe!clang::Parser::LexedMethod::ParseLexedMethodDefs() Line 258
clang.exe!clang::Parser::ParseLexedMethodDefs(clang::Parser::ParsingClass &
Class) Line 485
clang.exe!clang::Parser::ParseCXXMemberSpecification(clang::SourceLocation
RecordLoc, clang::SourceLocation AttrFixitLoc,
clang::Parser::ParsedAttributesWithRange & Attrs, unsigned int TagType,
clang::Decl * TagDecl) Line 3138
clang.exe!clang::Parser::ParseClassSpecifier(clang::tok::TokenKind TagTokKind,
clang::SourceLocation StartLoc, clang::DeclSpec & DS, const
clang::Parser::ParsedTemplateInfo & TemplateInfo, clang::AccessSpecifier AS,
bool EnteringContext, clang::Parser::DeclSpecContext DSC,
clang::Parser::ParsedAttributesWithRange & Attributes) Line 1777
clang.exe!clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec & DS, const
clang::Parser::ParsedTemplateInfo & TemplateInfo, clang::AccessSpecifier AS,
clang::Parser::DeclSpecContext DSContext, clang::Parser::LateParsedAttrList *
LateAttrs) Line 3410
clang.exe!clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange
& attrs, clang::ParsingDeclSpec & DS, clang::AccessSpecifier AS) Line 881
clang.exe!clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange
& attrs, clang::ParsingDeclSpec * DS, clang::AccessSpecifier AS) Line 956
clang.exe!clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange
& attrs, clang::ParsingDeclSpec * DS) Line 808
clang.exe!clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>
& Result) Line 595
clang.exe!clang::ParseAST(clang::Sema & S, bool PrintStats, bool
SkipFunctionBodies) Line 160
clang.exe!clang::ASTFrontendAction::ExecuteAction() Line 558
clang.exe!clang::CodeGenAction::ExecuteAction() Line 851
clang.exe!clang::FrontendAction::Execute() Line 461
clang.exe!clang::CompilerInstance::ExecuteAction(clang::FrontendAction & Act)
Line 877
clang.exe!clang::ExecuteCompilerInvocation(clang::CompilerInstance * Clang)
Line 241
clang.exe!cc1_main(llvm::ArrayRef<char const *> Argv, const char * Argv0, void
* MainAddr) Line 116
clang.exe!ExecuteCC1Tool(llvm::ArrayRef<char const *> argv, llvm::StringRef
Tool) Line 301
clang.exe!main(int argc_, const char * * argv_) Line 382
[...snip CRT spew...]
The crash can be made to go away by doing one of the following:
(1) remove the dllexport attribute
(2) change the constructor to either B(int) or B()
(3) remove the constexpr keyword
(4) make Ident() a non-template function (in that case, constexpr is OK), or
(5) make an explicit specialization i.e. template<> int Ident(int) (constexpr
or not) and instantiate that.</pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are on the CC list for the bug.</li>
</ul>
</body>
</html>