The problem is well posed, and Gurobi can compute duals for QPs (and QCPs, if you set QCPDual to 1).
Here’s how I would write the code in JuMP:
julia> using JuMP, Gurobi
julia> begin
model = Model(Gurobi.Optimizer)
set_silent(model)
@variable(model, x, Bin)
@variable(model, y)
@constraint(model, x * y >= 1)
@constraint(model, c1, x + y <= 6)
@objective(model, Max, y)
optimize!(model)
undo = fix_discrete_variables(model)
set_attribute(model, "QCPDual", 1)
optimize!(model)
@assert is_solved_and_feasible(model)
shadow_price(c1)
end
1.0